记得见过几次分组的题,再看到还是不会往递推上面想,这次记一下吧。
对于每个人,他到达的状态有两种,一种是不选这个人,另一种就是选了这个人以及之后能选的(pos[ i ]),然后可选的组数减一。搜的时候用一下记忆化。
//不加入组
//新开一组
int n,k;
int a[MAXN],pos[MAXN];
int dp[5555][5555];
int f(int i,int p)
{
if(i>n||p<=0) return 0;
int & ans=dp[i][p];
if(ans) return ans;
return ans=max(f(i+1,p),f(i+pos[i],p-1)+pos[i]);
}
signed main()
{
cin>>n>>k;
rpp(i,n) cin>>a[i];
sort(a+1,a+1+n);
rpp(i,n) pos[i]=upper_bound(a+1,a+n+1,a[i]+5)-a-i;//这个人为左端点能加入多少人
cout<<f(1,k)<<endl;
return 0;
}