zoukankan      html  css  js  c++  java
  • 小a与星际探索---DP

    题目描述 

    小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往nn号星球。其中每个星球有一个能量指数pp。星球ii能到达星球jj当且仅当pi>pjpi>pj。
    同时小a的飞船还有一个耐久度tt,初始时1号点的能量指数,若小a前往星球jj,那么飞船的耐久度会变为tpjt⊕pj(即tt异或pjpj,关于其定义请自行百度)
    小a想知道到达nn号星球时耐久度最大为多少
    注意:对于每个位置来说,从它出发可以到达的位置仅与两者的pp有关,与下标无关

    输入描述:

    第一行一个整数nn,表示星球数
    接下来一行有nn个整数,第ii个整数表示pipi

    输出描述:

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

    输入

    复制
    3
    457 456 23

    输出

    复制
    478

    说明

    小a有两种方法到达33号星球
    第一种:1231→2→3,最终耐久度为45745623=22457⊕456⊕23=22
    第二种:131→3,最终耐久度为45723=478457⊕23=478
    示例2

    输入

    复制
    4
    2 4 4 2

    输出

    复制
    -1
    示例3

    输入

    复制
    5
    234 233 123 2333 23

    输出

    复制
    253

    备注:

    1n,pi3000

    #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
    ");
      else
        printf("%d
    ", 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
    ");
      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
    ", mx);
      }
      return 0;
    }


  • 相关阅读:
    【转】Linux平台上用C++实现多线程互斥锁
    【转】用C++实现多线程Mutex锁(Win32)
    【转】ACM国内外OJ网站大集合
    【转】常用 blas 函数
    浏览器插件检查
    自定义事件
    JavaScript对象继承方式与优缺点
    如何页面减少重绘回流
    CSS3特效(3)——环形进度条
    CSS3特效(2)——文字特效
  • 原文地址:https://www.cnblogs.com/-citywall123/p/10311409.html
Copyright © 2011-2022 走看看