LOADING

加载过慢请开启缓存,浏览器默认开启

daily 1

2023/5/15 daily

CF 505C

开始想到直接dp,但是会爆内存,所以我们用对应跳的偏移量来存我们的第二维就好啦,注意偏移量可以是负数,所以要往右边移250

void solve(){
  int n,d;
  cin>>n>>d;
  vector<int>a(N);
  for(int i=0;i<n;++i){
    int x;
    cin>>x;
    a[x]++;
  }
  vector dp(N,vector<ll>(2*LIM+2,-1e8));
  dp[d][LIM]=a[d];
  ll ans=-1;
  for(int i=1;i<N;++i){
    for(int j=0;j<=2*LIM;++j){
        int last_pos=i-(j+d)+250;
        if(last_pos<0||last_pos>=i)continue;
        for(int k=-1;k<=1;++k){
            if(j+k>0){
                dp[i][j]=max(dp[last_pos][j+k]+a[i],dp[i][j]);
            }
        }
        ans=max(ans,dp[i][j]);
    }
  }
  cout<<ans<<'\n';
  return;
}