【DP 分组】整数分组
题目
思路
贪心没弹出来,结果发现别人用DP做的,实在是妙啊
定
义
f
[
i
]
[
j
]
为
前
i
个
数
,
组
数
不
超
过
j
,
合
法
条
件
下
最
多
选
的
数
字
数
量
定义f[i][j]为前i个数,组数不超过j,合法条件下最多选的数字数量
定义f[i][j]为前i个数,组数不超过j,合法条件下最多选的数字数量
状态转移
f
[
i
]
[
j
]
=
m
a
x
(
f
[
i
−
1
]
[
j
]
,
f
[
u
−
1
]
[
j
−
1
]
+
i
−
u
+
1
)
f[i][j]=max(f[i-1][j],f[u-1][j-1]+i-u+1)
f[i][j]=max(f[i−1][j],f[u−1][j−1]+i−u+1)
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5E3+10;
LL a[N];
int f[N][N];
int main(){
int n,k;cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n);
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;
}