# Codeforces 626F Group Projects (DP)

251人阅读 评论(0)

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;
}


0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：37069次
• 积分：2558
• 等级：
• 排名：第14889名
• 原创：228篇
• 转载：8篇
• 译文：0篇
• 评论：1条
文章分类
评论排行