博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【动态规划】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
阅读量:5794 次
发布时间:2019-06-18

本文共 904 字,大约阅读时间需要 3 分钟。

划分那个序列,没必要完全覆盖原序列。对于划分出来的每个序列,对于某个值v,要么全都在该序列,要么全都不在该序列。

 一个序列的价值是所有不同的值的异或和。整个的价值是所有划分出来的序列的价值之和。
 
 求整个的价值的最大值
 
f(i)表示最后一个划分序列的右端点为i时,1~i的答案。
f(i)=max{max{f(j)}(1<=j<i)+xorsum(j+1,i)(j+1到i的区间合法)}(1<=i<=n)
需要在转移的时候,顺便处理f(i)的前缀max。
最终的答案就是所有f(i)的最大值。
#include
#include
#include
using namespace std;int n,a[5010],f[5010],fpremax[5010],num[5010],cnts[5010];int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); ++num[a[i]]; } for(int i=1;i<=n;++i){ int no=0,xorsum=0; memset(cnts,0,sizeof(cnts)); for(int j=i;j>=1;--j){ if(!cnts[a[j]]){ xorsum^=a[j]; ++no; } ++cnts[a[j]]; if(cnts[a[j]]==num[a[j]]){ --no; } if(!no){ f[i]=max(f[i],fpremax[j-1]+xorsum); } } fpremax[i]=max(fpremax[i-1],f[i]); } printf("%d\n",fpremax[n]); return 0;}

转载于:https://www.cnblogs.com/autsky-jadek/p/6914836.html

你可能感兴趣的文章
Membership三步曲之进阶篇 - 深入剖析Provider Model
查看>>
前端优化及相关要点总结
查看>>
struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
查看>>
25 个精美的手机网站模板
查看>>
C#反射实例应用--------获取程序集信息和通过类名创建类实例
查看>>
VC中实现文字竖排的简单方法
查看>>
会话标识未更新
查看>>
阿里架构师:程序员必须掌握的几项核心技术能力
查看>>
程序员常用的六大技术博客类
查看>>
Iceworks 2.8.0 发布,自定义你的 React 模板
查看>>
胖哥学SpringMVC:请求方式转换过滤器配置
查看>>
Kotlin 更加优雅的 Builder - 理解 with
查看>>
前端日拱一卒D6——字符编码与浏览器解析
查看>>
深入理解浏览器的缓存机制
查看>>
微软向Linux社区开放60000多项专利:对开源微软是认真的
查看>>
Hoshin Kanri在丰田的应用
查看>>
又拍云沈志华:如何打造一款安全的App
查看>>
克服大数据集群的挑战
查看>>
PostgreSQL并发控制(MVCC, 事务,事务隔离级别)
查看>>
DM***的第二阶段OSPF
查看>>