题目链接:https://ac.nowcoder.com/acm/contest/317/C
题目描述
小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往nn号星球。其中每个星球有一个能量指数pp。星球ii能到达星球jj当且仅当pi>pjpi>pj。
同时小a的飞船还有一个耐久度tt,初始时为11号点的能量指数,若小a前往星球jj,那么飞船的耐久度会变为t⊕pjt⊕pj(即tt异或pjpj,关于其定义请自行百度)
小a想知道到达nn号星球时耐久度最大为多少
注意:对于每个位置来说,从它出发可以到达的位置仅与两者的pp有关,与下标无关
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=1<<12;//2的12次方,为3000互相亦或后的最大值
int p[3010],a[3010];
int dp[5000];//这个不能只开3010,应大于4096
bool cmp(int a, int b) {
return a>b;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>p[i];
if(p[1]<=p[n]) {//起点小于等于终点肯定不行
puts("-1");return 0;
}
int ans=p[1]^p[n];
int t=0;
for(int i=1;i<=n;i++)
if(p[1]>p[i]&&p[i]>p[n])//把不行的星球去掉
a[t++]=p[i];
sort(a,a+t,cmp);//从大到小排序
dp[ans]=1;
for(int i=0;i<t;i++)//dp
{
for(int j=M-1;j>=0;j--)
{
dp[j^a[i]]=max(dp[j^a[i]],dp[j]);
if(dp[j^a[i]]) ans=max(ans,j^a[i]);
}
}
cout<<ans<<endl;
}