YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

http://lx.lanqiao.cn/problem.page?gpid=T454

题解:

对于K,我们分为K组,对于每一组的任何两个相邻的数,控制他们的间隔为k,

比方说k=3,那么我们可以分为3组。

0,3,6,9....

1,4,7,10...

2,5,8,11...

这样就可以连续的保存任意个数,而且每一组的间隔为k。

然后再把每个数出现的次数保存一下,接下来就可以做dp了

即对于第i组的第j个数,dp[j]=max(dp[j-1],dp[j-2]+val[j]);

code:

#include<bits/stdc++.h>
using namespace std;
const int MAX_k=100005;
const int N=100005;
int dp[N];
int arr[N];
int num[N];
int val[N];
bool mark[N];
int main(){
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++) {
        cin>>arr[i];
        num[arr[i]]++;
    }
    int ans=0;
    if(k==0) {
        for(int i=1;i<=n;i++){
            if(!mark[arr[i]]) ans++;
            mark[arr[i]]=1;
        }
        cout<<ans<<endl;
    }
    else {
        for(int i=0;i<k;i++){
            int m=1;
            for(int j=i;j<=MAX_k;j+=k) val[m++]=num[j];
            dp[1]=val[1];
            for(int j=2;j<m;j++)   dp[j]=max(dp[j-1],dp[j-2]+val[j]);
            ans+=dp[m-1];
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

posted on 2020-10-08 22:40  Target--fly  阅读(133)  评论(0编辑  收藏  举报