![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
----- 动态规划 -----
ITCharge
高效率编程,慢节奏生活。
展开
-
HDU5492 Find a path【DP】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5492参考博文:http://blog.csdn.net/Baileys0530/article/details/48768123AC代码:#include#include#include#include#define LL __int64using nam原创 2015-10-03 17:32:05 · 741 阅读 · 0 评论 -
HDU1506_Largest Rectangle in a Histogram
题目大意:给你一个直方图,告诉你各个条形矩形的高度,求基线对齐构成的矩形中面积最大的矩形的面积对于每一个矩形。面积 = h[i]*(j-k+1),其中j,k是左右边界,h[i]是矩形的高。并且对于j <= x <= k,h[i] <= h[x]。本题中,找到左右边界j,k是关键。利用动态规划的方法,对于位置i,如果左边条形矩形的高度大于它本身,那么左边的左边界一定也满足位置i的左边界。同理如果右边条形矩形的高度大于它本身,那么右边的右边界也一定满足位置i的右边界。迭代循环下去。直到找到i的左右边原创 2014-10-18 09:57:36 · 2970 阅读 · 1 评论 -
HDU1171_Big Event in HDU【01背包】
题目大意:有N种设备,每种设备有一个价值和数量。先要将这N种设备按总价值尽可能的平均分给两个学院。若不能完全平均分,则第一个学院多分一点。问,两个学院能各能分得多少价值的设备?思路:每种设备都有一个数量和价值,可以把每一个设备都当做一件物品,比如第一种设备有M件,价值为V则转换为有M件物品,价值都为V。这样就能转换成01背包了。把总价值的一半当做背包容量。求最多能装多少价值的物品。因为在尽可能平分的基础上第一个学院要多分一些。所以结果为第一学院分得sum-dp[sum/2],第二学院分得dp[原创 2014-10-22 09:14:31 · 969 阅读 · 0 评论 -
POJ2264 HDU1503 Advanced Fruits【LCS】
题目大意:两种水果可以杂交出一种新的水果,现在要给新水果起名字,起名的规则是:这个名字要包含之前两种水果的名字的字母,要按原本字符串中字符的相对顺序。并且这个名字要尽可能的短。思路:先求出两种水果名字s1和s2最长公共子序列的长度,并且用pre[i][j]标记下dp[i][j]的上一个状态,来得到每个字符在新的字符串中的状态。然后从(len1,len2)回溯输出新的字符串序列。pre[i][j] == 0表示为上一个字符为公共子串,将s1[i-1]或s2[j-1]输出一次,pre[i][j]原创 2015-04-18 10:53:01 · 1576 阅读 · 0 评论 -
HDU1069_Monkey and Banana【LCS】
Monkey and Banana题目大意:屋顶上放有香蕉,猴子有N块长宽高分别为x*y*z的砖。猴子想要垒一座砖塔去吃香蕉。垒塔的时候上边的砖必须严格的比下边的砖小(上边砖长<下边砖长 && 上边砖宽<下边砖宽)。砖有无数块,问最高能垒多高。思路:虽然砖有无数块。但是长为x宽为y规模的砖只能用一块。因为上下砖长和宽都不等。但是一块砖有好多种放法。这里先对x,y,z递增排序。建一个结构体存摆放方法。让x为宽,y为长,z为高为一种摆法,让x为宽,z为长,y为高为一种摆法,y为宽,z为长,x为高为原创 2014-10-22 08:34:00 · 909 阅读 · 0 评论 -
HDU1331 HDU1579 Function Run Fun【记忆化搜索】
题目大意:给一些递归条件,给你三个数a、b、c,求出w(a,b,c)是多少。思路:按题目要求递归的话会超时,所以用dp[a][b][c]来保存下递归函数的值,自底向上得出结果。原创 2015-04-08 11:03:55 · 1244 阅读 · 0 评论 -
HDU1024_Max Sum Plus Plus【滚动数组】
题目大意:给你两个数M和N,之后是N个数,从这N个数找到M个子段,求M个子段的最大和思路:一开始不懂怎么找状态转移方程。参考别人博客才明白。.设dp[i][j] 为将前 j 个数字分成 i 段的最大和。num[j]为当前数字那么转移方程为 dp[i][j] = max(dp[i][j-1]+num[j],dp[i-1][k]+num[j]) (i-1<=k<=j-1)也可以视为 dp[i][j] = max(dp[i][j-1]+num[j],max(dp[i-1][i-1],dp[i-1][i]原创 2014-11-18 13:06:53 · 1054 阅读 · 0 评论 -
HDU1158_Employment Planning【DP】
题目大意:老板想要决定M个月每个月需要的工人数,已知雇佣一个工人的价格,工人的月薪,解雇一个工人的价格,又知道M个月每个月至少需要多少个工人。问:怎样雇佣工人,才能使得满足M个月工人需求的同时,付出最少的钱。思路:在M个月中求出最大的需求人数Max,那么无论下个月需要多少个工人,最多雇佣Max个工人也就够了。状态转移方程:dp[i][j] = min(dp[i-1][k] + cost)(num[i-1] <=k <= Max)意思是:第i个月雇佣j个人 = 当上个月雇佣k个人时的最小花费 +原创 2014-11-27 10:59:04 · 1561 阅读 · 0 评论 -
HDU1176_免费馅饼【数塔】
题目大意:总共有0~10个位置,gameboy站在5的位置上。给你馅饼掉落的时间的位置。gameboy每秒只能到自己位置临近的位置接馅饼。比如在5的位置上只能接到4 5 6的馅饼。在7的位置上只能接到 6 7 8的馅饼。问gameboy最后最多能接到多少馅饼。思路:动态规划的思想。将位置整体右移一个单位。位置为1~11。这样方便计算。建立二维数组。一维代表时间,二维代表位置。点上的值代表馅饼的个数。按时间顺序存储馅饼个数。最后从底往上递推。每次比较馅饼位置i和馅饼位置i-1和馅饼位置i+1的原创 2014-10-22 09:34:41 · 945 阅读 · 0 评论 -
HDU2845_Beans【不连续的最大子段和】【元素压缩】
题目大意:给你一个矩阵,不能选择每行中相邻的数字,也不能选当前行的上一行和下一行,问使所选数和最大的值是多少?思路:用元素压缩的思想。先把2维矩阵降为1维数组。对每行求出不相邻的数字最大和是多少,把几个数字和缩成一个数。再对所有行求出不相邻的行数字最大和是多少。对于每行求出不相邻的数字最大和的状态转移方程为dp[i+1] = max{吃i达到的最大值,不吃i达到的最大值+第i+1个数}原创 2014-11-04 20:27:11 · 1251 阅读 · 0 评论 -
HDU3427 Clickomania【记忆化搜索】【区间DP】
题目大意:Clickomania(彩球消除)是一款游戏,有几种颜色不同的方块排成一列。每次可以将一段连续的颜色相同的方块消除掉,消除后原本这段方块两端的方块连接在一起,比如:ABBBA,将中间的BBB消除后,就变成了AA。现在给你一段字符串,不同的字符代表不同的颜色,那么问题来了:能不能将整个字符串消除完。思路:字符串的题目。本来感觉题目没有思路、无从下手,所幸题目中给了能够消除的所有情况:xy,AxA,AxAyA三种情况。x和y表示可以消除的部分。把整个字符串看做一个区间,分解区间为多个原创 2015-02-09 09:22:22 · 1145 阅读 · 0 评论 -
POJ1631_Bridging signals【LIS】【二分法+栈】
题目大意:两边都有N个点,给你N个点的连线关系,现在删除一些线,使剩下的线不想交,求不相交的线最多有多少条。思路:都知道是最长上升子序列,那么怎么来的呢比如说现在有6对点,从上到下,左右两边的点是依次递增排序的。如果想让总的不相交的线数最多,那么从左边第一个点开始,每个点就要尽可能和右边序号最小的点连接,这样以后的点才能和更多的点连接。但是如果之后两个及两个以上的点所能连接的点都比第一个点连接的右边点序号小,且不相交,则舍弃第一个,选择之后的点,否则选择前一个。如题目中的图所示:左1和右4相原创 2014-11-24 11:46:41 · 1350 阅读 · 0 评论 -
HDU2870_Largest Submatrix【最大完全子矩阵】
题目大意:有个字母矩阵,包含字母"a、b、c、w、x、y、z",其中,w能变为"a、b",x能变为"b、c",y能变为"a、c",z能变为"a、b、c"。问能构成的最大字母完全一样的子矩阵面积为多大?思路:和HDU1505、HDU1506一样的思路,其中a[i][j]表示转换为字母a后以第i行为底,第j列上方连续空闲位置的高度。b[i][j]表示字母b……,c[i][j]表示字母c……遍历计算出该点向左右两边延伸的左右边界,从而计算出面积,最终比较计算出最大面积。原创 2014-11-04 17:13:15 · 1963 阅读 · 1 评论 -
HDU1003 Max Sum【DP】
题目大意:求使连续子序列的和最大的第一元素,最后一个元素位置,和子序列的和思路:动态规划的方法,主要是找到状态转移方程。将之前累加和加上当前值与当前值做比较, 如果将之前累加和加上当前值>当前值,那么加上当前值,最后一个元素位置变为i,如果将之前累加和加上当前值<当前值,那么sum[i] = a[i],并且改变第一元素位置为i,最后元素位置为i。具体看代码。状态转移方程:sum[i]=max(sum[i-1]+a[i],a[i]);原创 2014-10-17 21:33:07 · 1289 阅读 · 0 评论 -
HDU2082_找单词【多重背包】
题目大意:每个单词都有一个值,从A、B…到Z的值分别为1、2…到26现在给你26个字母每个字母的个数,问:能找到多少个字母总价值<=50的单词数。(单词排列顺序无关,ACM和CMA和AMC都视为同一个单词)思路:很多人都是用母函数做的,这里说下动态规划的思想。把A、B…到Z看做26种物品,每种物品的价值为1、2…到26,每种物品的个数有num[i]个。现有一个容量为50的背包,问有多少种装法,能满足背包中总价值<=50过程:开个二维数组,一维26个表示字母种类,二维50个表示价值。最后从1-原创 2014-10-20 10:43:19 · 2490 阅读 · 0 评论 -
HDU2059_龟兔赛跑【DP】
题目大意:龟兔赛跑,总长度为N,兔子以恒定速度VR跑,乌龟骑电动车跑,当电动车有电的时候最多跑C幂,有电的时候以VT1速度跑,没电的时候以VT2的速度跑,已知路上有N个充电站,给你N个充电站离起点的距离。每次充电需要T秒,问最终乌龟有可能赢得比赛吗?思路:为了计算每个加油站距离下个充电站的距离,可将起点和终点看做是充电站。这样总共就有N+2个充电站,序号为0~N+1。从第一个充电站到第N+1个充电站,计算出从第0个充电站到第j个充电站在充满电的情况下跑到第i个充电站的最短时间dp[i]。最终答原创 2014-11-27 08:51:45 · 1853 阅读 · 0 评论 -
HDU-2546-饭卡-01背包-2014-04-28 12:44:06
饭卡Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9569 Accepted Submission(s): 3297Problem Description电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前原创 2014-04-28 12:43:17 · 1088 阅读 · 0 评论 -
九度1131_合唱队形【LIS】【LCS】
题目1131:合唱队形时间限制:1 秒内存限制:32 兆特殊判题:否提交:1706解决:529题目描述:N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …,原创 2014-05-19 12:38:19 · 947 阅读 · 0 评论 -
切割钢条【动态规划】
切割钢条【动态规划】首先将钢条切割为长度为i和n - i两段,接着求解这两段的最优切割收益Ri和Rn - i(每种方案的最优收益为两段的最优收益之和),由于无法预知哪种方案会获得最优收益,我们必须考察所有可能的i,选取其中收益最大者。如果直接出售原钢条会获得最大收益,我们当然可以选择不做任何切割。钢条切割问题还存在一种相似的但更为简单的地柜求解方法:我们将钢条从左边切割下长度为i的一段,只对右边剩下长度为n-i的一段惊醒切割。(递归求解),对左边的一段则不再切割。即问题的分解方式为:将长度为n原创 2014-10-16 20:54:54 · 1278 阅读 · 0 评论 -
HDU2955_Robberies【01背包】
Robberies题目大意:有一个强盗要去几个银行偷盗,他既想多投点钱,又想尽量不被抓到。已知各个银行的金钱数和被抓的概率,以及强盗能容忍的最大被抓概率。求他最多能偷到多少钱?思路:背包问题,原先想的是把概率当做背包,在这个范围内最多能抢多少钱。但是问题出在概率这里,一是因为概率是浮点数,用作背包必须扩大10^n倍来用。二是最大不被抓概率不是简单的累加。二是p = (1-p1)(1-p2)(1-p3) 其中p为最大不被抓概率,p1,p2,p3为各个银行被抓概率。第二次想到把银行的钱当做背包,把原创 2014-10-17 19:33:49 · 3598 阅读 · 0 评论 -
HDU2084_数塔【简单题】【数塔】
题目大意:比较好理解思路:若从上往下考虑的话,每次有两个选择,N层数塔就有2^(N-1)种方案,遍历一边不科学。换种方式,从下往上考虑,每次比较临近两个数的大小,让较大的数往上加,这样每次选择得到的都是最优的情况,逐层上移累加,最终加到顶部的时候,得到的结果就是最优的,即最大的。原创 2014-10-20 09:25:14 · 1451 阅读 · 0 评论 -
HDU2602_Bone Collector【01背包】
Bone Collector题目大意:有一个骨头收藏家,他有一个容量为V的容器来收藏骨头。现在有N个骨头各个骨头的价值为v[i],各个骨头所占容量为w[i]。问他在容量为V的容器里,最多能收藏总价值为多少的骨头?思路:简单的01背包原创 2014-10-20 16:53:50 · 749 阅读 · 0 评论 -
HDU1081_To The Max【矩阵压缩】
题目大意:给你一个N,接下来是N*N的矩阵。数有正有负,求最大的子矩阵和。思路:1003题是一维的求连续子序列最大和,dp[i] = max(dp[i-1]+a[i],a[i])这道题是求二维的子矩阵最大和。考虑将二维转化为一维的。二维数组的每一行都可以看做一个一维数组。map[i][j]数组上存的是第i行前j列上的和第k行上,dp[k][i] = max(dp[k][i-1]+map[k][i],map[k][i]),但是这样只能知道第k行前i个数的最大和是多少,而不知道是第k行上从第几列到第原创 2014-11-26 16:07:41 · 1251 阅读 · 0 评论 -
HDU1421_搬寝室【最优决策】
题目大意:有N件物品,给你每件物品的重量,现在要搬2*k件物品到另一栋楼上,每次搬两件物品,每次耗费的疲劳度为两件物品重量差的平方。问:搬完2*k件物品,耗费的疲劳度最少为多少?思路:重量相差越小,则重量差的平方越小。所以先对重量进行排序,所选的一对物品,肯定是相邻的两件物品。设d[i][j]为前第i件物品选择第j对物品的时候,所消耗的最小疲劳度。前i件物品,若选择第i件物品,肯定是和第i-1件物品配对。这时候dp[i][j] = dp[i-2][j-1] + (w[i]-w[i-1])*(w原创 2014-11-06 21:09:56 · 960 阅读 · 0 评论 -
HDU1224_Free DIY Tour【DP】【回溯】
题目大意:进行一场DIY的旅行,总共有N座城市,每座城市有一个有趣值,但是城市之间不一定有直接通往的航班。 给你城市间航班情况。每次从第一个城市出发,最后回到第一个城市,形成一个环路。问使得有趣值最大的最佳环路和其有趣值是什么。思路:设dp[i]为从城市1到第i个城市获得的最大有趣值和,更新dp[i]的时候,用pre[i]记录当前节点的前驱,最后向前回溯并记录路径。然后输出路径。原创 2014-12-01 12:45:47 · 1299 阅读 · 0 评论 -
HDU1505_City Game【最大完全子矩阵】
City Game题目大意:给你一个M*N的区域。R代表被占用,F代表空闲。每块空闲的区域价值3美金,求全部由空闲区域围成的矩形的价值思路:1506的升级版。不同的是,1505是二维的。把2维转换为以每一行为底,组成的最大面积就转换成了1506题。参考1506题解题报告:http://blog.csdn.net/lianai911/article/details/40208265其中h[i][j]表示第i行为底,第j列上方连续空闲位置的高度。遍历计算出该点向左右两边延伸的左右边界,从而计算出原创 2014-10-20 16:38:45 · 2835 阅读 · 0 评论 -
HDU2159_FATE【二维费用背包】【完全背包】
FATE题目大意:xhd要杀怪升级,他有一个忍耐值。每只怪都有一个经验值和需要消耗的忍耐值。杀掉怪得到相应经验值,消耗掉相应忍耐值。 xhd最多能杀S只怪,升级共需要N的经验值。若他的忍耐度掉到0,则他不会再玩游戏了。输出他升完这一级,所能剩下最大的忍耐值。如果升不了级,则输出-1。思路:背包中要存的东西肯定是经验,但是背包的容量不单是怪物数,还有忍耐度。这样,把怪物数和忍耐度作为背包的二维容量。用两个循环,得到S个怪,M容量值内得到的最高经验值。最后遍历找出经验值高于升级经验值的最小消耗的原创 2014-10-23 15:06:07 · 945 阅读 · 0 评论 -
HDU2844_Coins【多重背包】【二进制优化】
题目大意:给你几种硬币的价值和数量,再给你一个最大钱数M,问你这些硬币能组成价值1到M的值有多少种思路:简单的多重背包,如果总容量比这个物品的容量要小,那么这个物品可以直接取完,相当于完全背包。否则的话就转成01背包来求解。原创 2014-10-29 16:46:24 · 1182 阅读 · 0 评论 -
POJ3176_Cow Bowling【数塔DP】
题目大意:给你一个三角形的数塔,问从上走到最下边,得到最大的和是多少思路:从下往上推,当前值大的和上边的值相加原创 2014-11-24 15:38:30 · 932 阅读 · 0 评论 -
HDU1160_FatMouse's Speed【LIS变形】
题目大意:胖老鼠以为越胖的老鼠跑的越快。现在给你一些老鼠的重量和速度,直到输入到文件结束,问:你能否找到一系列数据,来证明越胖的老鼠跑调越慢最后输出满足条件的数据个数,并按顺序输出每组数据原本所在的行数。思路:先用结构体存起来每只老鼠的体重、速度和所在行号。然后对结构体排序。先按体重递增排序,再按速度递减排序。之后按最长递减序列的求法求出符合的数据最大个数。用x[]数组存嘴上递减子序列的长度,用y[]记录排序后的最长递减子序列倒数第二个的下标。这样能够通过往前递推的方法依次找到最长递减子序列的原创 2014-11-25 22:58:35 · 1009 阅读 · 0 评论 -
HDU2391 Filthy Rich【数塔DP】
题目大意:在一个N*M的矩阵中,不同的位置上有不同重量的黄金,从矩阵的左上角开始,只能向右或是向下走,问:从左上角走到右下角最多能获得多少黄金。思路:简单的数塔DP,状态转移方程:dp[j] = max(dp[j-1],dp[j])+ Map[i][j]。原创 2015-03-30 11:49:03 · 1237 阅读 · 0 评论 -
Ural1114 Boxes【DP】
题目大意:有N个盒子,有红色和蓝色两种颜色的球。红球有A个,篮球有B个。现在随意的向盒子里放球,每个盒子可以放一种颜色的球,也可以放两种颜色的球,也可以不放球。问:总共有多少种方法。解题思路:用DP来做。设dp[i][j][k]表示到第i个盒子为止,用了j个红球和k个篮球。则dp[i][j][k] = Σ(dp[i-1][jj][kk])(j <= jj <= A,k <= kk <= B)。则最终结果为Σdp[N][j][k](0 <= j <= A,0 <= k <= B)。注意:这题l原创 2015-08-14 21:13:07 · 767 阅读 · 0 评论 -
HDU1028 Ignatius and the Princess III【母函数】【完全背包】
题目大意:给定正整数N,定义N = a[1] + a[2] + a[3] + … + a[m],a[i] > 0,1 <= m <= N。对于给定的正整数N,问:能够找出多少种这样的等式?思路:对于N = 4,4 = 4;4 = 3 + 1;4 = 2 + 2;4 = 2 + 1 + 1;4 = 1 + 1 + 1 + 1。共有5种。N=4时,结果就是5。其实就是整数分解问题,可写出母函数g(x) = (1+x+x^2+x^3+…)*(1+x^2+x^4+…)*(1+x^3+…)*(原创 2015-05-14 22:45:38 · 1102 阅读 · 0 评论 -
动态规划总结【模板】
最长递增子序列最大连续子序列和最大连续子矩阵和最大M个连续子段的和最大不连续子序列和最长公共子序列最长回文子序列最长回文子串最小编辑距离01背包完全背包多重背包二维费用背包切割钢条最大矩形问题原创 2015-05-01 23:49:13 · 4502 阅读 · 2 评论 -
HDU1059_Dividing【多重背包】【二进制】
题目大意:给你价值为1、2、3、4、5、6六种宝石的个数,把它按价值平均分成两份,不能切割,不能分开。问是否能平分思路:多重背包问题。先判断下宝石总价值是不是偶数,只有偶数才能平分。若是偶数在用多重背包左。只要总容量为价值的一半的背包能装满就能平分。多重背包用了二进制的思想。原创 2014-11-28 08:14:31 · 1143 阅读 · 0 评论 -
HDU1025_Constructing Roads In JGShining's Kingdom【LIS】【二分法】
题目大意:路两旁各有N个城市,一旁N个富城市,一旁N个穷城市,每个穷城市缺少一种资源(各不相同),每个富城市拥有一种资源(各不相同),穷城市p需要从富城市r得到这种资源,就得修路。为了不造成交通堵塞,修的路不能有交叉,问最多能修几条路,也就是有几个城市得到资源。思路:就是给你两边各N个点,在这两边连线,每个点只能连一次,问最多有多少线不交叉。把一边的点按升序排列,那么题目就转换为求另一边的最大上升子序列了,而这道题数据规模为500000,O(N^2)算法肯定超时,只能用栈+二分法的O(Nlog原创 2014-11-26 09:18:27 · 1198 阅读 · 0 评论 -
HDU1257_最少拦截系统【LIS】
最少拦截系统题目大意:导弹拦截系统每次拦截导弹的高度都不高于上一次拦截的高度给你一个导弹发射高度的序列,问最少用多少了拦截系统能够完成拦截?思路:往上很多人都说是最长上升(不降序)子序列。但是很不好理解。那么为什么是最长上升子序列呢。这是因为假设最长上升子序列长度为N,那么作为最长上升子序列的每个元素右边的非最长上升子序列的元素必然是下降的。且必然是最优情况。把每个最长上升子序列的元素作为一个拦截系统的起点,那么它右边比它本身小的下降序列就是这个拦截系统所能拦截的导弹,到下一个最长上升子序列原创 2014-11-06 11:43:34 · 876 阅读 · 0 评论 -
HDU1422 重温世界杯【DP】
题目大意:给你N个城市,参观路线为1~2~3~4~5~…~N~1。可以从任何一座城市开始参观。每座城市提供的生活费和需要的花费都不同,问:最多能参观多少个城市。思路:因为能形成循环,所以在原有数据的后边再接上1~N的数据。然后用动态规划来做。状态为:当上一个城市剩下的钱不为负(即还未结束旅游),如果上一个城市剩下的钱加上当前城市的钱大于当前的生活费,那么dp[i] = dp[i-1] + 1,更新剩下的钱,如果不够旅游了,就将剩下的钱归为0,从当前点开始旅游,计算最大的dp[i],得到的就是原创 2015-04-25 21:53:36 · 1464 阅读 · 0 评论 -
HDU1087_Super Jumping! Jumping! Jumping!【LIS】
Super Jumping! Jumping! Jumping!题目大意:跳棋游戏,每次只能跳到比当前棋子大的棋子上,且只能顺着方向跳,不能回头。求走过棋子的最大的棋子和。思路:类似于求最长上升子序列,这里求得是最长上升子序列中,和最大的子序列。设dp[i]为当前最长上升子序列元素和中——最大的和。转移方程:dp[i] = max(dp[i],dp[j]+num[i]) (0 <= j < i)从前往后,对于位置i,找出位置i前边的最大和加上num[i]。因为j也是从前向后递推更新的,所以原创 2014-10-20 17:41:39 · 749 阅读 · 0 评论 -
HDU1203_I NEED A OFFER!【01背包】
题目大意:Speakless有N万元,他要申请学校上学。总共有M个学校可申请,每个学校都有申请费和申请概率,求他最少能获得一个学校名额的概率最大为多大思路:动态规划,用01背包做。需要注意概率的算法。至少申请上一个学校的概率 = 1-(1-p1)(1-p2)(1-p3)… 其中,p1,p2,p3…为各个学校申请概率。将N元当做背包总容量,学校当做物品。申请费为体积,不被申请上的概率当做价值,转移方程就为 dp[j] = min(dp[j],dp[j-w[i]]*p[i]); 最终算得的dp[N原创 2014-10-22 10:34:28 · 1027 阅读 · 0 评论