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; }