Vladik and Memorable Trip
题意:给定一个数列,划分一些区间,规定该区间里面包括该区间出现的所有数字,该区间的贡献是区间里面不同数的异或和,答案是求能划分的最大值。
思路:dp,dp[i]表示从1到i划分所能取到的最大值,维护每个数的左右边界即可。
#include<bits/stdc++.h>
using namespace std;
int l[5005],r[5005];
int a[5005],vis[5005];
int dp[5005];
int main(){
int n;
scanf("%d",&n);
memset(l,0,sizeof(l));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(!l[a[i]])
l[a[i]]=i;
r[a[i]]=i;
}
dp[0]=0;
for(int i=1;i<=n;i++){
dp[i]=dp[i-1];
memset(vis,0,sizeof(vis));
int ans=0,rr=0,ll=6000;
for(int j=i;j>=1;j--){
int t=a[j];
if(!vis[t]){
rr=max(rr,r[t]);
if(rr>i)
break;
ll=min(ll,l[t]);
ans^=t;
vis[t]=1;
}
if(j<=ll){
dp[i]=max(dp[i],dp[j-1]+ans);
}
}
}
printf("%d\n",dp[n]);
}