题意:


思路:






#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 3e4 +10;
const int inf = 0x3f3f3f3f;
int a[N],n,d,f[N][510];
int base = 250;
int main(){
    scanf("%d%d",&n,&d);
    for(int i = 0,x;i < n;i++){
        scanf("%d",&x);
        a[x]++;
    }
    memset(f,-inf,sizeof(f));
    f[d][base] = a[d];
    int ans = f[d][base];
    for(int i = d;i <= 30000;i++){
        for(int j = 0;j <= 500;j++){
            int last = i - (d + j - base);
            if(last < d || last >= i) continue;
            for(int k = -1;k <= 1;k++){
                if(j + k >= 0) f[i][j] = max(f[i][j],f[last][j + k] +a[i]);
            }
            ans = max(ans,f[i][j]);
        }
    }
    printf("%d\n",ans);
    return 0;
}