# Codeforces 626F Group Projects (DP)

This is a dynamic programming problem. Notice that the total imbalance of the groups only depends on which students are the maximum in each group and which are the minimum in each group. We thus can think of groups as intervals bounded by the minimum and maximum student. Moreover, the total imbalance is the sum over all unit ranges of the number of intervals covering that range. We can use this formula to do our DP.

If we sort the students in increasing size, DP state is as follows: the number of students processed so far, the number of g groups which are currently “open” (have a minimum but no maximum), and the total imbalance k so far. For each student, we first add the appropriate value to the total imbalance (g times the distance to the previous student), and then either put the student in his own group (doesn’t change g), start a new group (increment g), add the student to one of the g groups (doesn’t change g), or close one of the g groups (decrement g).

Runtime: O(n2k)

[code]:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const LL MOD = 1e9+7;

int n,m,a[205];
LL dp[2][205][1005];

void sol(){
int i,j,k,k_,cr,nt;
LL val;
dp[0][0][0] = 1;
for(i = 0;i < n;i++){
cr = i&1,nt = (i+1)&1;
for(j = 0;j <= n;j++){
for(k = 0;k <= m;k++){
dp[nt][j][k] = 0;
}
}
for(j = 0;j <= n;j++){
for(k = 0;k <= m;k++){
val = dp[cr][j][k];
k_ = k + j*(a[i+1]-a[i]);
if(val==0||k_>m) continue;
dp[nt][j+1][k_] = (dp[nt][j+1][k_]+val)%MOD;
dp[nt][j][k_] = (dp[nt][j][k_]+(j+1)*val)%MOD;
if(j) dp[nt][j-1][k_] = (dp[nt][j-1][k_]+j*val)%MOD;
}
}
}
LL ans = 0;
for(k = 0;k <= m;k++) ans = (ans + dp[n&1][0][k])%MOD;
printf("%I64d\n",(ans+MOD)%MOD);
}

int main(){
int i,j,k;
scanf("%d%d",&n,&m);
for(i = 1;i <= n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);
sol();
return 0;
}


• 本文已收录于以下专栏：

## CodeForces 626F Group Projects（dp）

• u014664226
• 2016年04月06日 22:38
• 573

## codeforces626F Group Projects(dp)

Description There are n students in a class working on group projects. The students will divide into...
• Kirito_Acmer
• 2016年02月15日 21:58
• 590

## Codeforces 626F Group Projects 动态规划

• qq_33229466
• 2017年10月30日 11:50
• 88

## Codeforces Group Projects dp

http://codeforces.com/contest/626/problem/F 特别好的一道dp 想到了每个数作为一个集合的上界，下界。。。情况去分析但是一直想不通k的值的变化怎么搞。。。。。...
• meixiuxiudd
• 2016年02月20日 22:22
• 218

## [DP] Codeforces #626F. Group Projects

• CHHNZ
• 2017年10月25日 19:45
• 80

## codeforces 533B B. Work Group(树形dp)

• qq_24451605
• 2015年08月09日 14:36
• 918

## codeforces 626f

• u011528035
• 2016年02月22日 15:54
• 315

## codeforces 455B(博弈+dp)

• qq_24451605
• 2015年09月22日 10:01
• 1010

## Codeforces 721C. Journey（DAG上的DP）

• cmershen
• 2016年10月10日 17:50
• 762

## Codeforces 16E Fish (状压dp+概率)

• Dreamon3
• 2016年05月08日 19:00
• 538

举报原因： 您举报文章：Codeforces 626F Group Projects (DP) 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)