1. 程式人生 > >codeforces 1133E K Balanced Teams

codeforces 1133E K Balanced Teams

ble c++ signed () ams 應該 include bits clas

題目鏈接:http://codeforces.com/contest/1133/problem/E

題目大意:

在n個人中找到k個隊伍。每個隊伍必須滿足最大值減最小值不超過5。求滿足條件k個隊伍人數的總和的最大值。

這個題寫DP很多的人應該可以很快寫出來吧,畢竟不是很難。

思路:

反正最多n^2種狀態。用數組存就好了。

先排序。

對於每個點,dp[a][b]。表示a到n區間裏分b個隊伍的答案。

如果a是答案dp[a][b]所需要的,那麽我們從a開始到a+i暴力一下(此時,x[a+i]-x[a]>5。x是排完序後的數組),dp[a][b]=dp[i][b-1]+i-a。(因為a已經組了隊,所以b-1)

如果答案不需要a,dp[a][b]=dp[a+1][b]

真正的答案當然是兩者的最大值。

所以dp[a][b]=max(dp[i][b-1]+i-a,dp[a+1][b])

找到狀態轉移就很容易寫了。

#include <bits/stdc++.h>
using namespace std;

//#define int long long
#define IOS ios::sync_with_stdio(false);
#define endl "\n"
#define MAX 5005
#define mod 1000000007

int x[MAX];
int n,m; int dp[MAX][MAX]; int DP(int a,int b){ if(b<=0||a>n){ return 0; } if(dp[a][b]){ return dp[a][b]; } int i=a; for(;i<=n;i++){ if(x[i]-x[a]>5){ break; } } dp[a][b]=max(DP(i,b-1)+i-a,DP(a+1,b));
return dp[a][b]; } signed main() { IOS; cin>>n>>m; for(int i=1;i<=n;i++){ cin>>x[i]; } sort(x+1,x+1+n); cout<<DP(1,m); return 0; }

codeforces 1133E K Balanced Teams