![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
lhrsdl
这个作者很懒,什么都没留下…
展开
-
ACM日记——算法导论.15章 动态规划(一)
动态规划思想与分治思想类似,都是通过将大的问题分解成一个个更小的问题,通过更小的问题的解决来解决比它更大一层的问题,最终得到最后的结果,不过与普通分治不同,动态规划每次都会选取局部最优解,确切的说是“一个问题的最优解”,而不是“最优解”,因为一个问题可能有多个最优解。所以可以减少许多的重复过程,节约大量的时间,不过,动态规划dynamic programming 故名思义,这里的programmi原创 2014-07-25 16:19:04 · 1014 阅读 · 0 评论 -
DP入门50题(7)——NYoj37 回文字符串
题意:给一个字符串,让你添加字符使其变成回文字符串,问最少添加几个 思路:开始真没思路,后来看别人的提示,可以把这个问题转化成上一题的思路——最长公共子序列问题。 就是把这个串反转,然后求这两个串的最长公共子序列,用原串长度减去最长公共子序列长度不就是要添加的字符个数啦! 代码:#include <iostream>#include <cstdio>#include <string>#原创 2015-02-24 17:32:21 · 617 阅读 · 0 评论 -
DP入门50题(5)——NYoj 17 单调递增最长子序列
题意:正好跟上题导弹拦截相反,只不过单调递增而已。 解法:就是上一题的a[j]>a[i]改成a[j]#include <iostream>#include <cstdio>#include <cstring>using namespace std;int Max(int a,int b){return a>b?a:b;}char s[10002];int n,dp[20002],an原创 2015-02-24 17:09:39 · 551 阅读 · 0 评论 -
DP入门50题(3)——poj2229 sumsets
题意:求n的以2的次幂之和的形式组成的方法有多少种思路: 类似递推关系,还要考虑n的奇偶性: 首先: dp[1] = 1; dp[2] = 2; 然后开始考虑从3开始: 当n是奇数的时候,dp[i] = dp[i-1]; 当n是偶数的时候,dp[i] = dp[i-2]+dp[i/2];#include <iostream>#include <cstdio>using namesp原创 2015-02-23 22:20:21 · 654 阅读 · 0 评论 -
DP入门50题(4)——NYoj79 导弹拦截
题意:一种导弹拦截系统,有个缺陷,第一发炮弹能达到任意高度,但以后的炮弹都要比上一发低,问某政府只能买一套系统,最多能拦截几发炮弹。 思路:导弹拦截是经典动态规划题,这个问题其实可以看做是最长递减序列,每一发炮弹都要低于前一发的高度。那就用dp[i][j]表示j之前有多少个比i小的炮弹,取最大的就是当前dp[i][j]的值。也可以看做最长上升序列把判断条件反过来而已。代码: 这里用一维写的#i原创 2015-02-24 16:53:07 · 618 阅读 · 0 评论 -
DP入门50题(2)——NYoj252 01串
题意: 知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个,他希望你能帮帮他。 注:01串的长度为2时,有3种:00,01,10。思路: 从长度为2开始考虑,有00,01,10三种; 长度为3,有000,001,010,101,100五种; 长度为4,有0000,0001,0010,1010,0101,1001,1原创 2015-02-23 22:09:28 · 633 阅读 · 0 评论 -
DP入门50题(1) ——poj3176 数塔(详细、适合新手)
前天开始复习以前的烂摊子——DP,然后到今天,水了十二道题,现在回头边敲边写博客回忆一下。这是第一道题,也是一般ACMer的DP入门第一题吧 ^_^ 题意:大家也都知道的,输出从数塔第一层走到最后一层路径的最大值。思想:直接从底向上回溯就好了,比较直接,没有直接去套背包写的,适合新手看;首先把dp数组memset全为0,然后把数组最后一层a[n-1][i]的值赋给dp最后一层dp[n-1][i],原创 2015-02-23 21:45:04 · 828 阅读 · 0 评论 -
DP入门50题(6)——poj1458 最长公共子序列
题意: 以样例为例说明:abcfbc ***ab***f***c***a***b 最长公共子序列为abcb,长度为4 思路: dp[i][j]表示从S串的i之前到T串j之前最长公共子序列的长度 如果s[i-1] == t[i-1], dp[i][j] = dp[i-1][j-1]+1; 否则dp[i][j] = max(dp[i-1][j原创 2015-02-24 17:23:34 · 557 阅读 · 0 评论 -
动态规划:给自己的纠错贴(一)
太弱了,所以真的需要从头看动态规划,以前不好好原创 2014-11-13 19:37:14 · 607 阅读 · 0 评论 -
ACM日记——算法导论.15章 动态规划(二)
上一次我介绍了动态规划的基本思想,并且用算法导论里最简单的动态规划例子——钢条切割来加以辅助介绍,今天我会按照上次的步骤来,用另一个简单的DP例子“数塔问题”来演示动态规划的另一种最常用的实现方式——带备忘的自顶向下法(丫的就是递归-_-)。数塔问题呢,就是给你若干行(这里用n表示塔的层数)数字组成的塔,且第k层塔有k个数字,从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步原创 2014-07-25 16:22:47 · 833 阅读 · 0 评论 -
NYoj_DP_289苹果(01背包)
题意:裸01背包,第一行给出n个苹果和容量为m的背包,接下来n行为每个苹果的重量和价值。输出背包能装下的最大价值为多少。 思路:dp公式:dp[j] = max(dp[j],dp[j-cost[i]]+v[i]); 其中dp[j]的值代表当前背包剩余容量为j时最大价值。dp[j-cost[i]]为当前背包装入苹果i的时候(此时背包剩余容量为j-cost[i]),那价值就为dp[j-cost[i]原创 2015-04-08 21:23:17 · 660 阅读 · 0 评论