牛客寒假算法基础集训营1_C小a与星际探索(dp)

题目链接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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱吃狮子头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值