#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int main() {
int n,k;
scanf("%d %d",&n,&k);
vector<int> a(n);
vector<int> cnt(N);
int mx = 0;
for(int i=0; i<n; i++) {
scanf("%d",&a[i]);
cnt[a[i]]++;
mx = max(mx,a[i]);
}
if(!k) {
int ans = 0;
for(int i=0; i<=N; i++)ans+=(cnt[i]!=0);
printf("%d",ans);
return 0;
}
int ans = 0;
for(int i=0; i<k; i++) {//分为k组
int num = 0;//第i组共有num种数
vector<int> val(N);//val记录这组中第几个数有几个
vector<int> dp(N);//考虑到第j个数最大能选出多少人
for(int j=i; j<=mx; j+=k) {//第i组中的数为{i,i+k,i+2k...}
val[num] = cnt[j];
num ++;
}
dp[0] = val[0];
for(int j=1; j<num; j++){
if(j == 1)dp[1] = max(val[0],val[1]);
else{
dp[j]=max(dp[j-1],dp[j-2]+val[j]);
}
}
ans += dp[num-1];
}
printf("%d",ans);
return 0;
}
对局匹配 动态规划
最新推荐文章于 2024-07-25 11:27:31 发布