【动态规划】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip

划分那个序列,没必要完全覆盖原序列。对于划分出来的每个序列,对于某个值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<cstdio>
#include<algorithm>
#include<cstring>
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;
}
时间: 2024-10-11 04:28:28

【动态规划】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip的相关文章

Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip

题目链接:Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip 题意: 给你n个数,现在让你选一些区间出来,对于每个区间中的每一种数,全部都要出现在这个区间. 每个区间的价值为该区间不同的数的异或值,现在问你这n个数最大的价值是多少. 题解: 比赛的时间直接就想到了做法,不过在选取合法区间的时候,细节上出了点小问题. 然后一直wa到怀疑人生.太菜了. 首先,先将合法的区间选取出来. 对于这些区间,按照左端点排序, 然后对于选出来的

Codeforces Round #416 (Div. 2) 811D Vladik and Favorite Game

题目链接: http://codeforces.com/problemset/problem/811/D 题目描述: D. Vladik and Favorite Game This is an interactive problem. Vladik has favorite game, in which he plays all his free time. Game field could be represented as n?×?m matrix which consists of ce

(线段树+并查集) Codeforces Round #416 (Div. 2) E Vladik and Entertaining Flags

In his spare time Vladik estimates beauty of the flags. Every flag could be represented as the matrix n?×?m which consists of positive integers. Let's define the beauty of the flag as number of components in its matrix. We call component a set of cel

【分类讨论】【spfa】【BFS】Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game

那个人第一步肯定要么能向下走,要么能向右走.于是一定可以判断出上下是否对调,或者左右是否对调. 然后他往这个方向再走一走就能发现一定可以再往旁边走,此时就可以判断出另一个方向是否对调. 都判断出来以后,跑个spfa或者bfs就行了. 细节较多--有一些边界情况需要处理.比如终点在第一行或者第一列的情况. #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using n

Codeforces Round #416 (Div. 2) A+B

A. Vladik and Courtesy 2 seconds 256 megabytes At regular competition Vladik and Valera won a and b candies respectively. Vladik offered 1 his candy to Valera. After that Valera gave Vladik 2 his candies, so that no one thought that he was less gener

(dp) Codeforces Round #416 (Div. 2)

Vladik often travels by trains. He remembered some of his trips especially well and I would like to tell you about one of these trips: Vladik is at initial train station, and now n people (including Vladik) want to get on the train. They are already

Codeforces Round #416 (Div. 2)

B 前几天听cwy说O(m*n)被卡常,比赛时犹豫了好久才写,然后就A了,STL的常数很牛逼 大概2种方法:根据下标位置判断这个数值是否改变(找k-th min): 根据值来确定其下标,判断下标是否改变(找这个数是第几小,常数小) C n^2 dp,当时加了一些mark,实际上由于0?≤?ai?≤?5000,完全可以每次dp memset一波 D 交互题. 比赛时因为有一个for把3写成4,导致内存溢出,调了1个多小时都没有发现,还是太粗心(不过即使如此好像rank还是挺前面的..) 真可惜呀,

Codeforces Round #556 (Div. 2) - D. Three Religions(动态规划)

Problem  Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 3000 mSec Problem Description Input Output Sample Input 6 8abdabc+ 1 a+ 1 d+ 2 b+ 2 c+ 3 a+ 3 b+ 1 c- 2 Sample Output YESYESYESYESYESYESNOYES 题解:动态规划,意识到这个题是动态规划之后难点在于要优化什么东西,本题

CodeCraft-19 and Codeforces Round #537 (Div. 2) - D. Destroy the Colony(动态规划+组合数学)

Problem  CodeCraft-19 and Codeforces Round #537 (Div. 2) - D. Destroy the Colony Time Limit: 2000 mSec Problem Description Input Output For each question output the number of arrangements possible modulo 10^9+7. Sample Input abba21 41 2 Sample Output