原题链接:
http://codeforces.com/contest/505/problem/C
代码:
#include "stdio.h"
#include "iostream"
#include "string.h"
#include "algorithm"
using namespace std;
#define nmax 30010
int dp[nmax][501],n,d,f[30010],a,dmax=0,ans,l;
int main()
{
scanf("%d%d",&n,&d);
memset(f,0,sizeof(f));
memset(dp,-1,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
f[a]++;
dmax=max(dmax,a);
}
ans=f[d];
dp[d][250]=f[d];
for(int i=d;i<=dmax;i++)
{
for(int j=0;j<=500;j++)
{
if(dp[i][j]==-1)
continue;
l=d+(j-250);
if(l<=0)
continue;
if(i+l-1>30000)
break;
if(l!=1)
dp[i+l-1][j-1]=max(dp[i+l-1][j-1],dp[i][j]+f[i+l-1]);
dp[i+l][j]=max(dp[i+l][j],dp[i][j]+f[i+l]);
dp[i+l+1][j+1]=max(dp[i+l+1][j+1],dp[i][j]+f[i+l+1]);
ans=max(max(dp[i+l-1][j-1],dp[i+l][j]),max(ans,dp[i+l+1][j+1]));
}
}
printf("%d\n",ans);
return 0;
}