闫式dp分析法永远滴神!!!
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
int n,k,a[1000010];
int f[5010][5010];
//f[i][j]表示 前i个数中 j个分组的合法最大整数数量
//合法指一个组内 数与数的差值都不超过5
int main()
{
cin>>n>>k;
for (int i=1;i<=n;i++) {
scanf ("%d",&a[i]);
}
sort(a+1,a+n+1);
//先排序 方便处理 sort的复杂度是n(logn) 不会超时hh
for (int i=1,u=1;i<=n;i++){
while (a[i]-a[u]>5) u++;
for (int j=1;j<=k;j++){
f[i][j]=max(f[i-1][j],f[u-1][j-1]+i-u+1);
//状态转移方程得来见上图
}
}
cout<<f[n][k];
return 0;
}