Codeforces 626F Group Projects (DP)
题目链接 8VC Venture Cup 2016 - Elimination Round
题意 把$n$个物品分成若干组,每个组的代价为组内价值的极差,求所有组的代价之和不超过$k$的方案数。
考虑DP,$f[i][j][k]$表示考虑到第$i$个物品的时候,还有$j$组尚未分配完毕,当前状态总代价为$k$的方案数。
先把$a[]$升序排序,那么极差就可以转化为后面的元素减前面的元素不停叠加的效果。
当考虑第$i$个物品的时候有$4$种转移方法:
当前物品新开一组并且继续等待分配;
当前物品新开一组,并且这个物品单独当做一种;
当前物品插入到之前的$j$组中的一组中去并让这个组继续等待分配,那么有$j$种插入的方案;
当前物品插入到之前的$j$组中的一组中去并作为这个组的最大值(停止分配),同样有$j$种插入的方案。
时间复杂度$O(n^{2}k)$
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const int N = 202;
const int M = 1010;
const LL mod = 1e9 + 7; int n, m;
int a[N];
int x;
LL f[2][N][M];
LL ans; void up(LL &x, LL y){ x = x + y; x %= mod;} int main(){ scanf("%d%d", &n, &m);
rep(i, 1, n) scanf("%d", a + i); sort(a + 1, a + n + 1);
a[0] = a[1];
f[0][0][0] = 1; x = 1;
rep(i, 0, n - 1){
x ^= 1;
memset(f[x ^ 1], 0, sizeof f[x ^ 1]);
rep(j, 0, i){
rep(k, 0, m) if (f[x][j][k] && k + j * (a[i + 1] - a[i]) <= m){
int cnt = k + j * (a[i + 1] - a[i]);
up(f[x ^ 1][j + 1][cnt], f[x][j][k]);
up(f[x ^ 1][j][cnt], f[x][j][k]);
if (j){
up(f[x ^ 1][j][cnt], f[x][j][k] * j % mod);
up(f[x ^ 1][j - 1][cnt], f[x][j][k] * j % mod);
}
}
}
} ans = 0;
rep(i, 0, m) up(ans, f[x ^ 1][0][i]);
printf("%lld\n", ans);
return 0;
}
Codeforces 626F Group Projects (DP)的更多相关文章
- Codeforces 626F Group Projects(滚动数组+差分dp)
F. Group Projects time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...
- Codeforces Gym101341K:Competitions(DP)
http://codeforces.com/gym/101341/problem/K 题意:给出n个区间,每个区间有一个l, r, w,代表区间左端点右端点和区间的权值,现在可以选取一些区间,要求选择 ...
- Codeforces 704C - Black Widow(dp)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这种题被评到 *2900 是因为细节太繁琐了,而不是题目本身的难度,所以我切掉这种题根本不能说明什么-- 首先题目中有一个非 ...
- codeforces 711C Coloring Trees(DP)
题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...
- codeforces#1154F. Shovels Shop (dp)
题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...
- Codeforces 1051 D.Bicolorings(DP)
Codeforces 1051 D.Bicolorings 题意:一个2×n的方格纸,用黑白给格子涂色,要求分出k个连通块,求方案数. 思路:用0,1表示黑白,则第i列可以涂00,01,10,11,( ...
- Codeforces 1207C Gas Pipeline (dp)
题目链接:http://codeforces.com/problemset/problem/1207/C 题目大意是给一条道路修管道,相隔一个单位的管道有两个柱子支撑,管道柱子高度可以是1可以是2,道 ...
- Codeforces 682B New Skateboard(DP)
题目大概说给一个数字组成的字符串问有几个子串其代表的数字(可以有前导0)能被4整除. dp[i][m]表示字符串0...i中mod 4为m的后缀的个数 通过在i-1添加str[i]字符转移,或者以st ...
- Codeforces 543D Road Improvement(DP)
题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...
随机推荐
- APPIUM-----自动发现兼容的Chromedrivers
使用Appium Desired Capabilities:chromedriverExecutableDir chromeDriver所有版本下载路径:https://chromedriver.st ...
- python 学习分享-进程
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用的多进程包multiprocessing,只需要定 ...
- NGUI-为Popuplist的下拉选项添加删除功能
NGUI例子里的popuplist是这样的:,但有时我们希望下拉选项都有删除功能,也就是这样:,一种方法是改popuplist的源码,我想这个实现起来不难,但现在我想说的是用反射来实现此功能,以及其他 ...
- 条件随机场(Conditional random field)
条件随机场真是把我给折磨坏了啊,本以为一本小小的<统计学习方法>攻坚剩下最后一章,心情还是十分愉悦的,打算一口气把它看完,结果真正啃起来真是无比的艰难啊,每一句对我都好像是天书一般,怎么这 ...
- 第一次软件工程作业补充plus
一.代码的coding地址:coding地址. 二.<构建之法>读后问题以及感言(补充): 1.对于7.3MSF团队模型,7.2.6保持敏捷,预期和适应变化,中的"我们是预期变化 ...
- 软工实践 - 第十七次作业 Alpha 冲刺 (8/10)
队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/articles/10023469.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长 ...
- stuff使用感悟
select ),t2.CityId) from t t2 where not exists( from Web_UserCity uc where UserName='user001' and uc ...
- 一个自动安装LNMP的简洁Shell脚本
此脚本在生产服务器上使用了一年多,本脚本崇尚简单唯美,只需要一个脚本就可以在任何一台有网络的服务器上自动配置LNMP.本脚本会在脚本执行目录下,建packages目录用于存放LNMP所需要的软件.大家 ...
- Python字符串相关
#字符串的相关操作 #基本操作 #+ 字符串连接操作 str1 = '来是come走是go' str2 = '点头yes摇头no' result = str1 + str2 print(result) ...
- 雅礼集训 Day6 T1 Merchant 解题报告
Merchant 题目描述 有\(n\)个物品,第\(i\)个物品有两个属性\(k_i,b_i\),表示它在时刻\(x\)的价值为\(k_i\times x+b_i\). 当前处于时刻\(0\),你可 ...