zoukankan      html  css  js  c++  java
  • 505C Mr. Kitayuta, the Treasure Hunter

    传送门

    题目大意

    一共有30000个位置,从第0个位置开始走,第一次走k步,对于每一次走步,可以走上一次的ki+1 ,ki ,ki-1步数(必须大于等于1),每个岛上有value,求最大能得到的value能有多少。

    分析

    首先我们不难想到dpij表示走到第i个位置,上次走的步数为j,然而30000*30000时间复杂度和空间复杂度都会爆炸,所以我们考虑如何优化掉一维,然而我们发现是无法优化掉一维的。

    但由于一个只有30000个位置,所有我们想到上次走的步数的所有可能情况可能不是很多,由式子d+(d+1)+(d+2)+…+(d+maxl)≤30000可得maxl大致是250,也就是说上次走的步数最少是d-250,最多是d+250.于是我们得到dpij,其中i表示考虑到第i个位置,j表示上次走的长度-d,注意为了防止数组出现负数我们将第二维统一加上maxl。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    #define sp cout<<"---------------------------------------------------"<<endl;
    const int inf=1e9+7;
    int dp[30001][510],maxl=250,cnt[30001],N=30000;
    int main(){
          int n,m,i,j,k,d;
          scanf("%d%d",&n,&d);
          for(i=1;i<=n;i++)scanf("%d",&m),cnt[m]++;
          for(i=0;i<=N;i++)for(j=0;j<=505;j++)dp[i][j]=-inf;
          dp[d][maxl]=cnt[d]+cnt[0];
          for(i=d;i<N;i++)for(j=-maxl;j<=maxl;j++)if(dp[i][j+maxl]!=-inf){
            if(i+j+d<=N&&j+d>0)
              dp[i+j+d][j+maxl]=max(dp[i+j+d][j+maxl],dp[i][j+maxl]+cnt[i+j+d]);
            if(j+d-1>0&&i+j+d-1<=N&&j-1>=-maxl)
              dp[i+j+d-1][j-1+maxl]=max(dp[i+j+d-1][j-1+maxl],dp[i][j+maxl]+cnt[i+j+d-1]);
            if(j+d+1>0&&i+j+d+1<=N&&j+1<=maxl)
              dp[i+j+d+1][j+1+maxl]=max(dp[i+j+d+1][j+1+maxl],dp[i][j+maxl]+cnt[i+j+d+1]);
          }
          int ans=0;
          for(i=0;i<=N;i++)for(j=-maxl;j<=maxl;j++)ans=max(ans,dp[i][j+maxl]);
          cout<<ans<<endl;
          return 0;
    }
  • 相关阅读:
    旅行,写作,编程
    Limu:JavaScript的那些书
    怎样花两年时间去面试一个人
    IE6之各种不适记录
    19位编程大师集锦
    开源中最好的Web开发资源汇总
    流行Linux和Windows脚本语言列表
    近来,一组名为“全球郁闷青年写真”的照片在网上热传...
    浏览器端技术体系概览 前端开发的七种武器
    这个世界从来没有任何一件工作叫“钱多、事少、离家近”
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9292707.html
Copyright © 2011-2022 走看看