CF505C Mr. Kitayuta, the Treasure Hunter 题解
违规用户名1529916 · · 题解
洛谷题目传送门
CF 题目传送门
解法
显然可以用 dp 来做。一个朴素的 dp 是记
显然
注意到
于是我们只需要维护每个
令最大的偏移量为
记得偏移下标和记录不可达状态,dp 一下就做完了。
时间复杂度
:::success[代码]
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e4+5,MAXD=1005,OFFSET=500,INF=0x3f3f3f3f;
int n,d,ans,p[MAXN],cnt[MAXN],dp[MAXN][MAXD];
int main(){
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
cnt[p[i]]++;
}
memset(dp,-INF,sizeof(dp));
ans=dp[d][OFFSET]=cnt[d];
for(int i=d+1;i<MAXN;i++){
for(int j=0;j<MAXD;j++){
int l=d+j-OFFSET;
if(l<=0||i-l<d) continue;
if(j>0&&l>1) dp[i][j]=max(dp[i][j],dp[i-l][j-1]);
dp[i][j]=max(dp[i][j],dp[i-l][j]);
dp[i][j]=max(dp[i][j],dp[i-l][j+1]);
dp[i][j]+=cnt[i];
ans=max(ans,dp[i][j]);
}
}
printf("%d",ans);
return 0;
}
:::