动态规划
文章平均质量分 64
404-unkown
这个作者很懒,什么都没留下…
展开
-
POJ1742---Coins
题目大意:有N种货币v1,v2,v3,…,vn,每种有c1,c2,c3,…,cn个,求这些货币在不超过m的情况下能组成多少种面值 分析:多重背包。背包问题还不怎么熟,看了下别人的题解,大致的意思是,只有当面值j-v[i]出现过,面值j才能出现,并且货币i的使用次数不能超过c[i] 状态:d[j]表示面值为j的情况 状态转移:if(!dp[j] && dp[j-v[i]] && sum[j-v[原创 2015-03-14 23:07:53 · 299 阅读 · 0 评论 -
ZOJ3812--We need Medicine
题目大意:给出n个物品,每个物品有两个属性w[i]和t[i],然后,有q组查询,每组查询有两个数字m和s,从所有物品中挑出一些,使得w之和等于m,t之和等于s,每个物品只能挑一件,如果有这样的方案,就输出挑选的物品,没有的话,则输出No solution!。分析:01背包的加强版。参考别人的代码的。传送门http://blog.csdn.net/qian99/article/detai原创 2015-08-29 14:53:45 · 438 阅读 · 0 评论 -
POJ2184--Cow Exhibition
题目大意:每头牛有smart值和fun值,选择若干头牛,使得smart值和fun值总和最大,并且保证smart和fun的总值分别都为非负。求最大值分析:01背包的变形。有篇文章写的比较清楚http://www.hankcs.com/program/algorithm/poj-cow-exhibition-problem-solution-challenge-programming-原创 2015-08-04 10:36:37 · 380 阅读 · 0 评论 -
POJ3260--The Fewest Coins(混合背包)
题目大意:一个人去买M元的东西,身上有N种面值的钱币,每个种钱币面额为w[i],个数是c[i],售货员当然是各种钱币都有,并且足够找他钱的啦~现在这个人给这M元的东西要付款了,他想使得付出的钱和找回的钱的个数最少。问最少多少个? 分析:多重背包+完全背包。对于消费者来说,就是一个多重背包。对于售货员来说,就是一个完全背包。数组的上界处理叫做鸽笼原理?代码:#includ原创 2015-08-31 21:41:23 · 356 阅读 · 0 评论 -
哗啦啦村的扩建(树形DP)
题目大意:已知,n个房子,n-1条路,保证从任意房子可以到达任意其他房子。对于每条道路,假设这条道路左边有x个房子,右边有y个房子,这条道路长度为k,那么费用就是k*|x-y|。请问,修建这n-1条路的费用是多少? 分析:给出一个最小生成树,自然就想到树形DP,从任意一个房子开始搜都可以。代码:#include <cstdio>#include <iostream>#include <cstr原创 2015-07-12 21:41:33 · 396 阅读 · 0 评论 -
喵哈哈的日常选数问题(数位DP)
题目大意:给出一个区间,求不含37或者4的数个数 分析:经典数位DP问题。推荐一个ppt:http://wenku.baidu.com/view/9de41d51168884868662d623.html代码:#include <iostream>#include <string>#include <cstring>#include <algorithm>using namespace s原创 2015-07-17 21:48:17 · 345 阅读 · 0 评论 -
小晴天老师系列——苹果大丰收(动态规划)
题目大意:m个苹果,n个一模一样箱子,求有多少种分法。 分析:分两种情况。 1、当苹果比箱子多的时候,方法数等于把i个苹果放入j-1个箱子的方法数加上,先把每个箱子都放一个苹果后,剩余的苹果放入j个箱子的方法数。 2、当苹果比箱子少的时候,方法数等于把i个苹果放入j-1个箱子的方法数 状态:dp[i][j]表示把i个苹果放入j个箱子的方法数。 状态转移方程: 1、当i >原创 2015-05-24 12:13:12 · 776 阅读 · 0 评论 -
喵哈哈村的挑衅(区间DP)
题目大意:有两排物品,每排都有n个,青君和狗哥轮流从每排的两侧拿任意一个物品。青君先手,假设狗哥绝顶聪明,青君所拿物品价值之和最大为多少? 分析:区间DP。 状态:dp[x1][y1][x2][y2],表示在区间[x1, y1]和区间[x2, y2]中能取到的最大值。 状态转移方程:有四种情况,分别为x1+1,y1-1,x2+1,y2-1。显然取四个原创 2015-07-12 21:30:20 · 533 阅读 · 0 评论 -
UVa10635--Prince and Princess(LCS转LIS)
题目:UVa10635分析:由于每个序列中的所有元素各不相同,所以可以先将任意一个序列的元素,修改为该序列中当前元素在另一个序列中对应元素的下标。没有匹配的就设为0或舍弃不要。这样就将LCS问题转化为了LIS,时间复杂度就降下来了。代码:#include #include #include #include using namespace std;const原创 2015-10-23 10:02:00 · 351 阅读 · 0 评论 -
Codeforces Round #323 (Div. 2) D题 (LIS)
题目大意:给出一个数列,有n个数,往后循环T次,问最长非下降子序列分析:由于T的范围过大,无法用普通的DP求解,需要稍微处理下。首先,我们可以发现如果只遍历第一个序列,然后推后续的想法是错误的。因为处理中间那些段时,我们的取值不全都是1。所以我们要多处理至少100段。然后,我们能够确定初始数列中出现次数最多的项,必定会在最长子序列中一直出现。接着,就可以用普通的DP来求解这原创 2015-10-06 22:04:43 · 428 阅读 · 1 评论 -
CDOJ1357--柱爷与最大区间和
传送门:http://acm.uestc.edu.cn/#/problem/show/1357分析:首先,我们需要知道怎么求一段最大区间和。从左往右扫的时候,用pre记录当前的最大值,f[i]表示从最左端到i这个区间上的最大和。当扫到i时,如果pre已经小于0,那么直接将a[i]赋值给pre,否则加上a[i],然后f[i]=max(f[i-1], pre)。时间复杂度为O(n)。求两段原创 2016-05-27 09:04:38 · 627 阅读 · 0 评论 -
POJ2836--Rectangular Covering
题目大意:在一个平面里,有n个点,用若干矩形来覆盖所有点,每个矩形的所有边上都必须包含一共至少两个点,求最小总面积。 分析:状压DP。状态:dp[i]表示点集为i时的最小面积。状态转移方程:dp[新点集] = min(dp[新点集] , dp[旧点集]+新矩形面积)代码:#include #include #include #include using name原创 2015-08-28 12:05:33 · 469 阅读 · 0 评论 -
POJ2441--Arrange the Bulls
题目大意:有N头牛,M个谷仓。每头牛都有自己喜欢呆的谷仓。每个谷仓只能安排一头牛。问一共有多少种分法。 分析:状压DP。状态:dp[i][j]表示第i头牛谷仓状态为j时的方法数。状态转移方程:dp[i][j] += dp[i-1][k],k从0到1代码:#include #include #include using namespace std;int dp[原创 2015-08-27 22:12:12 · 404 阅读 · 0 评论 -
POJ1065---Wooden Sticks
题目大意:给出n根木棒,每个木棒都有自己的长度和重量,求不下降子序列的最小个数,后一个木棒的长度和重量都要大于等于前一个 分析:贪心+动态规划代码:#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct stick{ int l, w;};stick c[5005];in原创 2015-03-15 09:54:01 · 355 阅读 · 0 评论 -
POJ3616---Milking Time
题目大意:Bessie在N个小时内可以给M头奶牛挤奶,挤完一头牛需休息R小时,求怎样挤才能使产量最多 分析:权重的DP,先进行排序,再转移 状态:d[i]表示在从开始到第i段的最优解。 状态转移:if(a[i].x >= a[j].y+r) d[i] = max(d[i], d[j]+a[i].w); 代码:#include <cstdio>#i原创 2015-03-14 17:29:29 · 448 阅读 · 0 评论 -
POJ2385--Apple Catching
题目大意:Farmer John一开始是站在树1下面,他可以在树1和树2之间来回移动W次,每分钟只能移动一次,也可以不移动每分钟有且只有一棵树会掉苹果,问在时间为T分钟内,他可以得到多少个苹果 分析:状态:dp[i][j]表示在第i分钟时,已经移动了j次后得到的苹果数量。状态转移方程:dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]),然后判断当前是否在第原创 2015-08-24 21:26:05 · 2222 阅读 · 1 评论 -
POJ3176--Cow Bowling
题目大意:就是一个数字三角形。。 分析:见紫书动态规划讲解...代码:#include #include using namespace std;int a[360][360], d[360];int main() { int n; scanf("%d", &n); for(int i = 0; i < n; i++)原创 2015-08-24 21:32:33 · 267 阅读 · 0 评论 -
POJ3046--Ant Counting
题目大意:有T个种族的蚂蚁,共有A只。每个种族里的每个蚂蚁都不一样。求从A只中任取n(S 分析:状态:dp[i][j]从前i个种族里,取j个蚂蚁状态转移方程:dp[i][j] = dp[i][j]+dp[i-1][j-k](0解释为给前i-1个种族形成的j-k只蚂蚁加入k只第i个种族的蚂蚁,k从0取到第i个种族蚂蚁的数量。累加之后,得到前i个种族形成的j个蚂蚁的集合个数。原创 2015-08-24 23:56:13 · 404 阅读 · 0 评论 -
POJ3280--Cheapest Palindrome
题目大意:给出一个长为m的字符串,可以添加删除n个字母,添加和删除的花费不一样。求使字符串变为回文串的最小花费。 分析:状态:dp[i][j]表示将原字符串的子串s[i...j]变为回文串的最小花费。注意增加和删除其实是一个障眼法,当在首尾增加一个字符使得一个字符串变成回文的话,那么删除一个也可以,这样自然是取增加删除的花费最小值状态转移方程:dp[i][j] = min(dp[i原创 2015-08-24 21:23:40 · 515 阅读 · 0 评论 -
POJ3181--Dollar Dayz
题目大意:给出两个整数n,m,求m以内的整数组成n有多少种情况 分析:这题数据超大,使用了将大数分开处理的方法。参考了别人的分析http://blog.csdn.net/libin56842/article/details/9455979。接下来,先介绍一下整数划分的问题。 所谓整数划分,是把一个整数N拆分成一组数相加并且等于N的问题。例如:65+14+2,4+1+原创 2015-08-25 00:14:53 · 395 阅读 · 0 评论 -
POJ2229--Sumsets
题目大意:把一个整数分解为2的幂的和共有几种方案 分析:以6和7为例,6 = 1+1+1+1+1+16 = 1+1+1+1+26 = 1+1+2+26 = 1+1+46 = 2+2+26 = 2+4 7 = 1+1+1+1+1+1+17 = 1+1+1+1+1+27 = 1+1+1+2+27 = 1+1+1+47 = 1+2+2+27 =原创 2015-08-24 21:30:49 · 351 阅读 · 0 评论 -
POJ3254--Corn Fields
题目大意:有一个m*n的场地,1表示可以种草,0表示不可以。在草地上可以放牛,但是,两头牛不能相邻,问有多少种放牛方法(牛的数量不限,不放牛也算一种)。 分析:状压DP。状态:dp[i][j]表示第i行第j种状态的方法数。状态转移方程,慢慢分析。首先,我们判断一行有多少种放牛方法,因为1不能相邻,且最多只有12列,所以总数不会超过600。接着,判断哪些方法与第一行场地不矛盾,由于只原创 2015-08-27 22:10:42 · 235 阅读 · 0 评论 -
POJ2686--Travelling by Stagecoach
题目大意:m个城市,p条双向路,n张车票,上面记录着马的数量,从一个城市到另一个城市都需要用车票,时间为,两个城市之间道路的长度除以车票上马的数量。求从城市a到城市b的最短时间,无法到达输出Impossible分析:状压DP。状态:dp[S][v],表示的是到达城市v,且剩下的车票的集合为S时的最短时间状态转移方程:dp[S & ~(1代码:#include #i原创 2015-08-26 22:16:49 · 304 阅读 · 0 评论 -
hdu5691--Sitting in Line(状压DP,2016百度之星Round2A/1002)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5691分析:看到N的范围,八成就是状压。q[i]表示第i个位置填第几个数。 状态:st[i][j]表示用了i这种情况里这些数,从左往右填以j为结尾的最大值。 状态转移方程:当第k个位置已经被固定填什么数时,向状态st里添加i并以i为结尾,dp[st|原创 2016-05-21 22:40:45 · 782 阅读 · 0 评论