Codeforces 626F Group Projects (DP)

原创 2016年05月31日 15:50:22

官方题解很详细

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)

题意:有n个商品,每件商品有一个价值,现在要把商品分组,求每组的最大价值与最小价值的价格差的和不超过m种的分组种数。 思路: 这道题dp状态不太好想,很容易想到一种状态是用dp[I][j][k]表示...
  • u014664226
  • 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
  • Kirito_Acmer
  • 2016年02月15日 21:58
  • 590

Codeforces 626F Group Projects 动态规划

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

Codeforces Group Projects dp

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

[DP] Codeforces #626F. Group Projects

显然是 DPDP。这种贡献和最值有关的,一般用按顺序插入的方法 DPDP,会简单很多。有挺多类似的题的。 这题就是 fi,j,kf_{i,j,k} 表示插入了前 ii 个,有 jj 个块开发待插入,...
  • CHHNZ
  • CHHNZ
  • 2017年10月25日 19:45
  • 80

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

题目链接:codeforces 533B题目大意:每个人有一个直接的领导,1是总裁,现在要找一个最大的集合,每个领导领导的人的数量都是偶数,问最大的值是多少。题目分析: 定义状态dp[u][i]dp[...
  • qq_24451605
  • qq_24451605
  • 2015年08月09日 14:36
  • 918

codeforces 626f

这题不会写 看了官方题解才知道 T T  感觉涨姿势了  题意:将数据分成若干组 每组的价值为最大值减去最小值  问不超过可k的方案数 有多少种? 思路:虽然我知道是一道dp题目,但是第二个状态总...
  • u011528035
  • u011528035
  • 2016年02月22日 15:54
  • 315

codeforces 455B(博弈+dp)

题目链接:codeforces 455B题目大意:给出n个字符串,进行k次游戏,每次游戏输家下次作为先手,游戏规则为每次放一个字母,导致当前构造的字符串是给定的任意一个字符串的前缀,不能操作时为输,赢...
  • qq_24451605
  • qq_24451605
  • 2015年09月22日 10:01
  • 1010

Codeforces 721C. Journey(DAG上的DP)

传送门 http://codeforces.com/problemset/problem/721/C题目大意: 有一个dag图,代表一个城市。城市里有若干景点,以及连接景点的单向道路,每条道路都有一...
  • cmershen
  • cmershen
  • 2016年10月10日 17:50
  • 762

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

题意有n条鱼,他们相遇时会吃掉对方,给出他们相遇时双方获胜的概率,求这n条鱼最后剩下自己的概率。思路看范围就要考虑状压DP,dp[s]表示当前剩下的鱼的状态为s时的概率。 那么P(i吃掉j) = P...
  • Dreamon3
  • Dreamon3
  • 2016年05月08日 19:00
  • 538
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces 626F Group Projects (DP)
举报原因:
原因补充:

(最多只允许输入30个字)