CodeForces
来源:互联网 发布:房卡游戏源码 编辑:程序博客网 时间:2024/05/17 02:47
题目来源:http://codeforces.com/problemset/problem/811/C
比较简单的dp问题,可以先预处理出每一区段的亦或值,要注意需要保证区段中的所有出现的数的全部都应在区段中。
记录区段中各数的出现次数,若与总数想等则该数符合题意。如果区段中所有出现的数的总数均与总数相等,则更新区段的值。
dp时,f[i]表示1~i的所有选中区段的和的最大值,方程f[i]=max(f[i],f[j-1]+s[j][i])(j<i)(s为区段亦或值)。
提供一组数据:
Input
1004 3 5 5 2 0 4 0 1 5 1 2 5 5 2 0 2 3 0 0 0 5 4 4 3 0 5 5 4 0 4 4 1 2 0 4 3 5 4 3 5 1 1 0 0 4 2 0 5 0 1 5 3 3 4 5 1 2 2 5 0 3 3 1 2 0 1 3 0 4 5 4 4 1 5 3 0 2 3 4 1 5 5 0 5 0 0 3 2 1 4 3 4 1 4 5 3 0 5 3
Output
1
所选区段为整个区段。故结果为0^1^2^3^4^5=1。
代码:
#include <bits/stdc++.h>using namespace std;int n;const int maxn=5001;int a[maxn];int l[maxn];int r[maxn];int cnt=0;int p[maxn];int s[maxn][maxn];int f[maxn];int vis[maxn];int main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n;for(int i=1;i<=n;i++){cin>>a[i];cnt=max(cnt,a[i]);if(!l[a[i]])l[a[i]]=i;r[a[i]]=i;p[a[i]]++;}for(int i=1;i<=n;i++){int num=0;int tot=0;memset(vis,0,sizeof(vis));for(int j=i;j<=n;j++){if(!vis[a[j]]){num=num^a[j];tot++;}vis[a[j]]++;if(vis[a[j]]==p[a[j]])tot--;if(!tot)s[i][j]=num;}}for(int i=1;i<=n;i++){f[i]=f[i-1];for(int j=1;j<=i;j++)f[i]=max(f[i],f[j-1]+s[j][i]);}cout<<f[n];return 0;}
阅读全文
0 0
- codeforces~~~
- Codeforces
- codeforces
- Codeforces
- codeforces
- codeforces
- Codeforces
- Codeforces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Java中的foreach用法
- 求两个map之间key的交集
- Java基础语法之关键字
- ssh+jbpm整合代码示例
- 禁止外部往复制文件到手机中
- CodeForces
- 解决Eclipse中properties文件乱码问题
- jde 动态添加筛选条件的注意事项
- js对数组排序
- 树结构练习——排序二叉树的中序遍历
- 2017/8/4 第十二天
- 欢迎使用Markdown编辑器写博客
- hdu6073二分图完美匹配之权值之积再求和
- java微信自动回复机器人开发(java微信开发学习笔记3)