小a与星际探索---dp

来自牛客网集训营1一道题:小a与星际探索

题目描述

小a正在玩一款星际探索游戏,小a需要驾驶着飞船从1号星球出发前往n号星球。其中每个星球有一个能量指数p。星球i能到达星球j当且仅当pi>pj。
同时小a的飞船还有一个耐久度t,初始时为1号点的能量指数,若小a前往星球j,那么飞船的耐久度会变为t⊕pj(即t异或pj,关于其定义请自行百度)
小a想知道到达n号星球时耐久度最大为多少

注意:对于每个位置来说,从它出发可以到达的位置仅与两者的p有关,与下标无关

输入描述:

第一行一个整数n,表示星球数
接下来一行有n个整数,第i个整数表示pi

输出描述:

一个整数表示到达n号星球时最大的耐久度
若不能到达n号星球或到达时的最大耐久度为0,则输出−1

输入

5
234 233 123 2333 23

输出

253

备注:

1⩽n,∀pi⩽3000

先上代码

#include 
#include 
const int maxn = 1 << 12;  //3000

bool dp[maxn];  //判断当前耐久度是否可达
int exp[3005], ex[3005]; //ex[]是有可能到达的星球的能量

int main()
{
    int n, pos, ans;
    while(~scanf("%d", &n))
    {
        memset(dp, 0, sizeof(dp));
        for(int i=0; i exp[n-1])
                    ex[pos++] = exp[i]; //初步判断有可能到达的星球的能量
        }
        for(int i = 0; i=0; --j)
            {
                dp[j] |= dp[j^ex[i]];  //之前dp[j]已经为true,则不取当前的ex[i],dp[j]保持为true,表示j可达
            }
        }
        for(int i = maxn-1; i>=0; --i)
        {
            if(dp[i]) //从大到小,如果当前耐久度可达
            {
                ans = i; break;
            }
        }
        printf("%d\n", ans ? ans: -1);
    }
    return 0;
}

你可能感兴趣的:(小a与星际探索---dp)