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]产生的 ...
随机推荐
- java编程-无锁初始化
private final Node<K,V>[] initTable() { Node<K,V>[] tab; int sc; while ((tab = table) == ...
- 《数据结构》C++代码 邻接表与邻接矩阵
上一篇“BFS与DFS”写完,突然意识到这个可能偏离了“数据结构”的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵. 存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表 ...
- C++文件操作(转)
C++文件操作(转) 第一个:简单,容易理解,常用:http://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126545.html 第二个:详细的,如 ...
- 。net可以点出属性,编译没问题,运行时就报错了。一笔记。
项目框架是这样的. 在 domain(你可以把它理解为你的bll) ,web 2个项目工程里面都引用了一个通过nuget管理程序包,比如 xxcommon.dll web 引用了 domain ,然后 ...
- 在Linux下安装ArcGIS10.2
最近由于工作需要,沉迷可视化无法自拔,一直在研究基于GIS的地图可视化,自己在本机windows搭建了一个ArcGIS服务器,用Tableau和R调用WMS服务成功,不愧是GIS元老级应用,效果超赞. ...
- Escape From The Earth 逃离地球
1.对Tags进行管理 设置一个全局的类,类似如下: public class Tags:MonoBehaviour{ public const string player="Player& ...
- ASP NET Core 部署 IIS 和发布
1. 微软官网原文链接: https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/index?view=aspnetcore- ...
- css 外边距,内边距的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 爬虫:Scrapy14 - Telnet 终端(Telnet Console)
Scrapy 提供了内置的 Telnet 终端,以供检查,控制 Scrapy 运行的进程.Telnet 仅仅是一个运行在 Scrapy 进程中的普通 Python 终端.因此你可以在其中做任何是. T ...
- node+express+nginx搭建站点
window系统 1.安装node 2.新建文件夹test 3. cmd 命令行 cd test 进入test文件夹下 输入命令:npm -v查看版本 确认node是否安装成功 4.npm init ...