dp : 背包dp
文章平均质量分 90
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
UVa 12563 Jin Ge Jin Qu hao dp : 0-1背包问题
(If you smiled when you see the title, this problem is for you ^_^) For those who don’t know KTV, see: http://en.wikipedia.org/wiki/Karaoke_box There is one very popular song called Jin Ge Jin Qu(). It is a mix of 37 songs, and is extremely long (1原创 2016-02-24 17:29:19 · 1744 阅读 · 0 评论 -
UESTC 1691 这是一道比CCCC简单题经典的中档题 多重背包
多重背包转化成0-1背包来跑。for(i = 1; i <= n; i++){ for(k = 0; k <= c[i]; k++){ for(j = w; j >= 0; j--){ if(j - k*need[i] >= 0) dp[i][j] = max(dp[i][j], dp[i-1][j-k*need[i]] + k*value[i]); else break; } } for(j = 0原创 2017-06-11 17:31:31 · 727 阅读 · 0 评论 -
UESTC 1606 难喝的饮料 0-1背包+完全背包
0-1背包+完全背包通过递推顺序,第一维可以直接省略for(i = 1; i <= n; i++){ if(c[i]){//0-1背包 for(j = w; j >= 0; j--){ if(j - need[i] >= 0) dp[j] = max(dp[j], dp[j-need[i]] + value[i]); else break; } } else{//完全背包 for(j =原创 2017-06-11 17:07:47 · 1082 阅读 · 0 评论 -
HihoCoder - 1043 完全背包 基础dp、背包dp
题意:dp基础题,给出n种背包每种有无限个,每个花费为needi 价值为 valuei,总花费m,求最大价值和。基础dp、背包dpdpj表示,总花费为j时的最大价值和,dpj = dp[j- needi] + valuei;这里直接对于每个背包i,直接从0~m进行递推,dp[j- needi] 可以是上一个背包递推过来的,也可以是当前背包递推过来的。复杂度 O(n^2)原创 2017-04-29 00:31:26 · 956 阅读 · 0 评论 -
HihoCoder - 1038 01背包 基础dp、背包dp
基础dp、背包dpdpij表示当前考虑第i个背包,花费为j时的最大收获。由于状态转移只考虑当前状态和上一层状态,所以只能可以转化成一维,然后dp的是 j 从大到小的顺序进行递推,这样 dp[ j-need[i] ]必定必定是上一次的,而不是这一次的。复杂度 O(n^2)原创 2017-04-29 00:24:23 · 877 阅读 · 0 评论 -
UVALive - 7544 Banking II 朴素dp、类似于背包的dp
题意:给出一个数字字符串,然后给出一个由小写字母构成的字符串,每个小写字母x 表示 有且必须选择一段连续的长度为 x - 'a' + 1的数字字符,然后要求这些小写字母按顺序选取数字字符串的子串,求选取的数字的和的最大值朴素dp、类似于背包的dp定义dpij 表示当前在考略第i个小写字母,将要选取的数字字符串子串是 [j - ( k[i] - 'a' + 1), j],时已经选中的数字的和的最大值,每次初始为 dpij = dpi-1j,然后进行转移即可复杂度 O(n^2)原创 2017-01-21 19:54:29 · 669 阅读 · 0 评论 -
Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses 并查集+双重01背包
题意:一堆人,这些人构成一些集合,2个元素至少有一条路径则为同一个集合,对于这些集合每个交合要么全取要不去不超过一个人,且每个人有一个wi和ai,要求在总wi小于等于w的情况下,是总ai最大并查集+双重01背包先用并查集处理出ptr-1个集合,然后对于这ptr-1个集合要么全取要么去不大于1个,跑一边01背包。dp[i][j]表示到 第i个背包是,总消耗容量j是最多装 dpij的东西。复杂度 O(N^2)原创 2017-01-10 18:50:54 · 708 阅读 · 0 评论 -
Gym - 101102A A. Coins 背包问题、数学
题意:在a中选一个子集b中选一个子集,使它们的和为w且abs(sumai - sumbi) <= k,问方案数。背包问题、数学w = sumai +sumbi,da[j]表示a构出和为j时的方案数,db[j]为构出和为j时的方案数。故枚举可能的sumai,然后对应w - sumai,则ans = sigma(da[sumai] * db[w - sumai])然后求da,db的方法是01背包,复杂度 O(n*w)原创 2017-01-14 20:56:34 · 1007 阅读 · 0 评论 -
UESTC 2016 Summer Training #2 Div.2 A dp、递推、多阶段问题
训练的时候刚开始想到的是记忆化搜索, 但无论怎么优化还是TLE 3,没办法,想想递推怎么写但是转化方程还是有点小问题, WA5然后后来才想明白只要 dp[i][j] = max(dp[i+1][j], dp[i][j+1]) + s[i][j]; if(dp[i][j] > 0) dp[i][j] = 0;这里不要讨论s[i][j]的正负,都是直接加上s[i][j]就好了然后处理好边界就好了dp检查的时候应当着重与转移方程啊⊙﹏⊙‖∣原创 2016-07-13 00:59:18 · 1390 阅读 · 0 评论 -
2016 UESTC Training for Dynamic Programming C - 柱爷的下凡 预处理打表、背包问题
预处理打表这个三个数 必有 1 所以只要枚举完1 < j, k <= n就好了,当然记录好每个N对应min的 ans2[n], ans3[n]然后输出到txt,然后paste 进去。O(1)的查询, T次查询故复杂度O(n);原创 2016-05-17 11:45:06 · 1048 阅读 · 0 评论 -
2016 UESTC Training for Dynamic Programming A - 柱爷与咸鱼神功 0-1背包
裸的0-1背包问题dp[i][j] 表示都第i层时剩余j的最大消费d[i][j] = max(d[i][j], d[i+1][j-mo[i]]+val[i]) // 如果j >= mo[i], 然后这个方程,用倒的递推就好了边界处理 d[i][j] = (i==M ? 0 : d[i+1][j])虽然 Ti <= 10000 但 Ti <= N <= 5000 的所以Ti <= 5000 , dp[maxn][maxn就好,不然可能会出问题,优化一点也总是好的吧复杂度 O(M*N);原创 2016-05-17 11:43:12 · 896 阅读 · 0 评论 -
UESTC 1692 这是一道比CCCC简单题更有想象力的中档题 完全背包
完全背包dp[i][j][k],已经考虑了前i个队员,写了j行代码,存在k个Bug的方案数,通过递推顺序,第一维可以直接省略if (k>=arr[i]) dp[j][k]=(dp[j][k]+dp[j-1][k-arr[i]])%mod; //这行代码的实际含义是dp[i][j][k]=(dp[i-1][j][k]+dp[i][j-1][k-arr[i]]),思考清楚为什么是这样的,尤其是为什么等式右边先是i-1,后面是i?//转移方程似乎没有体现出一个队员可以写多份代码?提醒:这里的递推顺序原创 2017-06-11 18:08:34 · 891 阅读 · 0 评论