小a与星际探索---DP
题目描述
小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往nn号星球。其中每个星球有一个能量指数pp。星球ii能到达星球jj当且仅当pi>pjpi>pj。
同时小a的飞船还有一个耐久度tt,初始时为1号点的能量指数,若小a前往星球jj,那么飞船的耐久度会变为t⊕pjt⊕pj(即tt异或pjpj,关于其定义请自行百度)
小a想知道到达nn号星球时耐久度最大为多少
同时小a的飞船还有一个耐久度tt,初始时为1号点的能量指数,若小a前往星球jj,那么飞船的耐久度会变为t⊕pjt⊕pj(即tt异或pjpj,关于其定义请自行百度)
小a想知道到达nn号星球时耐久度最大为多少
注意:对于每个位置来说,从它出发可以到达的位置仅与两者的pp有关,与下标无关
输入描述:
第一行一个整数nn,表示星球数
接下来一行有nn个整数,第ii个整数表示pipi
输出描述:
一个整数表示到达nn号星球时最大的耐久度
若不能到达nn号星球或到达时的最大耐久度为00则输出−1−1
示例1
备注:
1⩽n,∀pi⩽3000
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; #define ll long long #define maxn 3005 int p[maxn]; int dp[maxn]; int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &p[i]); memset(dp, 0, sizeof(dp)); dp[1] = p[1]; for (int i = 2; i <= n; i++) { int mx = 0; for (int j = 1; j<i; j++) { if (dp[j] == 0) continue; if (p[j]>p[i]) mx = max(dp[j] ^ p[i], mx); } dp[i] = mx; } if (dp[n] == 0) printf("-1\n"); else printf("%d\n", dp[n]); return 0; }
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[5000],vis[5000];//dp[i]储存的是耐久度为i的能量指数,vis[i]起标记作用 int p[4000];//能量值 int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&p[i]); } memset(vis,0,sizeof(vis)); vis[p[1]^p[n]]=1; dp[p[1]^p[n]]=p[1]; if(p[n]>=p[1]) printf("-1\n"); else { for(int i=2;i<n;i++) { if(p[1]>p[i]&&p[i]>p[n]) { for(int j=5000;j>=0;j--) { if(vis[j^p[i]]==1&&p[i]<dp[j^p[i]])//更新路径 { vis[j]=1; dp[j]=p[i]; } } } } int mx=-1; for(int i=5000;i>=1;i--)//i代表耐久度值,找到最大就退出 { if(vis[i]) { mx=i; break; } } printf("%d\n", mx); } return 0; }
等风起的那一天,我已准备好一切