Codeforces 626F Group Projects (DP)

来源:互联网 发布:四九算法是虚岁 编辑:程序博客网 时间:2024/04/28 06:12

官方题解很详细

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
原创粉丝点击