codeforces 1133E
题意:
给
定
n
位
学
生
的
能
力
值
,
要
求
从
中
选
出
若
干
学
生
组
成
不
超
过
k
支
队
伍
,
且
队
伍
内
学
生
的
能
力
差
值
不
能
超
过
5
。
给定n位学生的能力值,要求从中选出若干学生组成不超过k支队伍,且队伍内学生的能力差值不能超过5。
给定n位学生的能力值,要求从中选出若干学生组成不超过k支队伍,且队伍内学生的能力差值不能超过5。
问
组
成
的
所
有
队
伍
中
的
最
大
人
数
。
问组成的所有队伍中的最大人数。
问组成的所有队伍中的最大人数。
题解:
d p [ i ] [ j ] 表 示 从 前 i 位 学 生 中 挑 选 组 成 的 j 支 队 伍 中 的 最 大 人 数 。 dp[i][j]表示从前i位学生中挑选组成的j支队伍中的最大人数。 dp[i][j]表示从前i位学生中挑选组成的j支队伍中的最大人数。
- d p [ i ] [ t ] = m a x ( d p [ i − 1 ] [ t ] , d p [ j − 1 ] [ t − 1 ] + i − j + 1 ) dp[i][t] = max(dp[i-1][t], dp[j-1][t-1]+i-j+1) dp[i][t]=max(dp[i−1][t],dp[j−1][t−1]+i−j+1)
#include <bits\stdc++.h>
using namespace std;
const int N = 5001;
int a[N];
int dp[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 ; i <= n ; i++){
int j = i;
while(j > 1 && a[i]-a[j-1] <= 5) j--;
for(int t = 1 ; t <= k ; t++)
dp[i][t] = max(dp[i-1][t], dp[j-1][t-1]+i-j+1);
}
cout << dp[n][k] << endl;
return 0;
}