[Codeforces626F] Group Projects (DP)
Group Projects
Description
There are n students in a class working on group projects. The students will divide into groups (some students may be in groups alone), work on their independent pieces, and then discuss the results together. It takes the i-th student ai minutes to finish his/her independent piece.
If students work at different paces, it can be frustrating for the faster students and stressful for the slower ones. In particular, the imbalance of a group is defined as the maximum ai in the group minus the minimum ai in the group. Note that a group containing a single student has an imbalance of 0. How many ways are there for the students to divide into groups so that the total imbalance of all groups is at most k?
Two divisions are considered distinct if there exists a pair of students who work in the same group in one division but different groups in the other.
Input
The first line contains two space-separated integers n and k (1 ≤ n ≤ 200, 0 ≤ k ≤ 1000) — the number of students and the maximum total imbalance allowed, respectively.
The second line contains n space-separated integers ai (1 ≤ ai ≤ 500) — the time it takes the i-th student to complete his/her independent piece of work.
Output
Print a single integer, the number of ways the students can form groups. As the answer may be large, print its value modulo \(10^9 + 7\).
Sample Input
3 2
2 4 5
Sample Output
3
题目大意
有n个商品,每个商品有不同的价值。要求把这些商品分组,每组有一个值为组内商品的最大价值差,问是这些每组值的和不超过m的方案数,答案对\(1e9+7\)取模。
这道题的定义比较难,首先我们我们对商品按其价值由小到大进行排序。我们可以发现,每一组的价值差为相邻商品价值差的和。
定义dp[i][j][k]表示前i件商品还有j组未完成,差值为k的分组种数。
共有4种转移方案
temp = (a[i] - a[i-1]) * j;
- 第i件商品加入一个新分组,并且该分组未完成; dp[i][j+1][k] = dp[i][j+1][k] + dp[i-1][j][k-temp];
- 第i件商品加入一个新分组,并且该分组只有一个元素;dp[i][j][k] = dp[i][j][k] + dp[i-1][j][k-temp];
- 第i件商品加入一个之前的分组,并且该分组未完成; dp[i][j][k] = dp[i][j][k] + dp[i-1][j][k-temp] * j;
- 第i件商品加入一个之前的分组,并且该分组已完成。 dp[i][j-1][k] = dp[i][j-1][k] + dp[i-1][j][k-temp] * j;
每一个转移都只与i 和 i-1有关,所以我们可以用滚动数组进行优化,
时间复杂度为\(O(n^2k)\), 空间复杂度为\(nk\).
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int mod = 1e9 + 7;
int n,m;
int dp[2][210][1010];
int a[210];
int main(){
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> m;
for(int i = 1;i <= n;i++)cin >> a[i];
sort(a + 1,a + n + 1);
dp[0][0][0] = 1;
int cur = 0;
for(int i = 1;i <= n;i++){
cur ^= 1;
memset(dp[cur],0,sizeof(dp[cur]));
int v = a[i] - a[i-1];
for(int j = 0;j < i;j++){
int temp = v * j;
for(int k = temp;k <= m;k++){
dp[cur][j + 1][k] = (dp[cur][j + 1][k] + dp[cur^1][j][k-temp]) % mod;
dp[cur][j][k] = (dp[cur][j][k] + dp[cur^1][j][k-temp]) % mod;
if(j)dp[cur][j-1][k] = (dp[cur][j-1][k] + (long long)dp[cur^1][j][k-temp] * j) % mod;
if(j)dp[cur][j][k] = (dp[cur][j][k] + (long long)dp[cur^1][j][k-temp] * j) % mod;
}
}
}
int ans = 0;
for(int i = 0;i <= m;i++)
ans = (ans + dp[cur][0][i]) % mod;
cout << ans << endl;
return 0;
}
[Codeforces626F] Group Projects (DP)的更多相关文章
- 8VC Venture Cup 2016 - Elimination Round F - Group Projects dp好题
F - Group Projects 题目大意:给你n个物品, 每个物品有个权值ai, 把它们分成若干组, 总消耗为每组里的最大值减最小值之和. 问你一共有多少种分组方法. 思路:感觉刚看到的时候的想 ...
- 8VC Venture Cup 2016 - Elimination Round F. Group Projects dp
F. Group Projects 题目连接: http://www.codeforces.com/contest/626/problem/F Description There are n stud ...
- DP的序--Codeforces626F. Group Projects
$n \leq 200$个数,$ \leq 500$,$K \leq 1000$代价内的数字分组有多少?一个分组的代价是分成的每个小组的总代价:一个小组的代价是极差. 问的极差那就从极入手嘛.一个小组 ...
- Codeforces 626F Group Projects(滚动数组+差分dp)
F. Group Projects time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...
- Codeforces 8VC Venture Cup 2016 - Elimination Round F. Group Projects 差分DP*****
F. Group Projects There are n students in a class working on group projects. The students will div ...
- 【CodeForces】626 F. Group Projects 动态规划
[题目]F. Group Projects [题意]给定k和n个数字ai,要求分成若干集合使得每个集合内部极差的总和不超过k的方案数.n<=200,m<=1000,1<=ai< ...
- [CF626F]Group Projects
[CF626F]Group Projects 题目大意: 有一个长度为\(n(n\le200)\)的数列\(\{A_i\}\),将其划分成若干个子集,每个子集贡献为子集\(\max-\min\).求子 ...
- Codeforces 626F Group Projects (DP)
题目链接 8VC Venture Cup 2016 - Elimination Round 题意 把$n$个物品分成若干组,每个组的代价为组内价值的极差,求所有组的代价之和不超过$k$的方案数. ...
- VK Cup 2015 - Round 2 (unofficial online mirror, Div. 1 only) B. Work Group 树形dp
题目链接: http://codeforces.com/problemset/problem/533/B B. Work Group time limit per test2 secondsmemor ...
随机推荐
- WebView自适应屏幕大小
webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLoadWithOverviewMode(true); ...
- 1009: 恺撒Caesar密码
1009: 恺撒Caesar密码 时间限制: 10 Sec 内存限制: 128 MB提交: 349 解决: 215[提交][状态][讨论版] 题目描述 Julius Caesar 生活在充满危险和 ...
- thinphp讲解(三)——空操作、空控制器、跨控制器、命名空间
一.“空操作”本质意思:一个对象(控制器)调用本身不存在的操作方法 一般网站处于安全考虑不给用户提示任何错误信息 在tp里面控制器controller.class.php里有个_call()方法 所以 ...
- remoting方式
1. WebService跨平台,跨防火墙,但是很抱歉,基于xml速度慢2. RMI(java)/Remoting(.net)平台相关,基于二进制序列化,速度快.3.dcom(com+)spring提 ...
- IOC依赖注入简单实例
转自:http://hi.baidu.com/xyz136299110/item/a32be4269e9d0c55c38d59e6 相信大家看过相当多的IOC依赖注入的例子. 但大家在没有明白原理的情 ...
- HDU 5950:Recursive sequence(矩阵快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:给出 a,b,n,递推出 f(n) = f(n-1) + f(n-2) * 2 + n ^ 4. f ...
- easyui datagrid 每条数据后添加操作按钮
easyui datagrid 每条数据后添加“编辑.查看.删除”按钮 1.给datagrid添加操作字段:字段值 <table class="easyui-datagrid" ...
- recyclview多条目布局
多条目基础 http://blog.csdn.net/fangchao3652/article/details/43148871 添加底部加载更多 http://blog.csdn.net/fangc ...
- linux终端拖动鼠标总是产生ctrl+c
是因为有道词典,打开有道词典设置,取消勾选取词划词里面的所有框框
- rtc关机闹钟7 jni层 com_android_server_AlarmManagerService
frameworks/base/services/core/jni/com_android_server_AlarmManagerService.cpp int AlarmImplAlarmDrive ...