C. Vladik and Memorable Trip(线性dp)

感觉是非常显然的dp(别打我)

预处理每个区间是否合法

预处理每个区间的异或价值

转移直接暴力去前面找左端点转移就是了

感觉没1900分┭┮﹏┭┮

#include <bits/stdc++.h>
using namespace std;
const int maxn=5009;
int n,a[maxn],vis[maxn],temp[maxn],dp[maxn];
int isok[maxn][maxn],xoR[maxn][maxn];
int main()
{
	cin >> n;
	for(int i=1;i<=n;i++)	cin >> a[i],vis[ a[i] ]++;
	for(int i=1;i<=n;i++)
	{
		memset( temp,0,sizeof(temp) );
		int shu=0;
		for(int j=i;j<=n;j++)
		{
			xoR[i][j]=xoR[i][j-1];
			temp[ a[j] ]++;
			if( temp[ a[j] ]==1 )	shu++,xoR[i][j]^=a[j];//出现不同数字的个数
			if( temp[ a[j] ]==vis[ a[j] ])	shu--;//完全包含
			if( shu==0 )	isok[i][j]=1; 
		}
	}
	for(int i=1;i<=n;i++)
	{
		dp[i]=dp[i-1];
		for(int j=1;j<=i;j++)
			if( isok[j][i] )	dp[i]=max( dp[i],dp[j-1]+xoR[j][i] );
	}
	cout << dp[n];
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107895626