[转] 理解动态规划、分治法和贪心法

转自:http://www.cnblogs.com/airwindow/p/4067902.html

动态规划、分治法和贪心法都是利用求解子问题,而后利用子问题求解更上层问题,最终获得全局解决方案的方法。

但是三者的应用场景和性质却存在着极大的不同:

1.分治法

很容易与动态规划问题混淆,但两者却有着本质上的差异。

分治法采用的是递归的思想来求解问题,两个分解的子问题独立求解,其之间无任何的重叠。而上一层问题只需要对两个子问题进行一定的merge即可得到答案。即s(t)= s(sub1)+s(sub2),但是s(sub1)和s(sub2)之间(看子问题)无任何重叠。

典型应用:

a. 并规排序。

b. 芯片诊断。(前提是对的芯片>错误的芯片)

2. 贪心法

可以定义为 s(t)= s(t-1) + selection acoording to certain criteria。

同样其使用了类似迭代子问题的求解方式,逐步求得全局的最优答案。而其只有一个s(t-1),故不存在重叠求解子问题的情况。

3. 动态规划方法

该种方法较为复杂,但十分有用和高效,其核心性质是当前当前问题的答案s(t),并不能单独由s(t-1)求得。还有可能需要使用到s(1)...s(t-1)。具体需要使用到那些,是由问题本身的性质所决定的(常常是一个约束,或变相的约束)。

时间: 2024-10-16 06:27:27

[转] 理解动态规划、分治法和贪心法的相关文章

理解动态规划、分治法和贪心法

本文转自:http://www.cnblogs.com/airwindow/p/4067902.html http://hi.baidu.com/35661327/blog/item/d5463e17f1e8d011972b439c.html 动态规划.分治法和贪心法都是利用求解子问题,而后利用子问题求解更上层问题,最终获得全局解决方案的方法. 但是三者的应用场景和性质却存在着极大的不同: 1.分治法 很容易与动态规划问题混淆,但两者却有着本质上的差异. 分治法采用的是递归的思想来求解问题,两个

贪心法

贪心法(Greedy Approach)又称贪婪法, 在对问题求解时,总是做出在当前看来是最好的选择,或者说是:总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的.虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解.如单源最短路经问题,最小生成树问题等.在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似. 贪心法的设计思想 当一个问题具有以

[LeetCode]wildcard matching通配符实现之贪心法

前天用递归LTE,昨天用动态规划LTE,今天接着搞,改用贪心法.题目再放一次: '?'匹配任意字符,'*'匹配任意长度字符串 Some examples: isMatch("aa","a") → false isMatch("aa","aa") → true isMatch("aaa","aa") → false isMatch("aa", "*"

算法题解之贪心法

Wiggle Subsequence 最长扭动子序列 思路1:动态规划.状态dp[i]表示以nums[i]为末尾的最长wiggle子序列的长度.时间是O(n^2). 1 public class Solution { 2 public int wiggleMaxLength(int[] nums) { 3 if (nums == null || nums.length == 0) { 4 return 0; 5 } 6 int[] pos_dp = new int[nums.length]; 7

笨办法理解动态规划算法

动态规划在编程中有着广泛的应用,对于某些问题我们可以通过动态规划显著的降低程序的时间复杂度.本质上动态规划并不是一种算法,而是解决一类问题的思想.本篇博客通过一些非常简单而又经典的问题(比如数塔.0-1背包.完全背包.走楼梯问题.最长公共子序列等)来帮助大家理解动态规划的一般套路. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1 动态规划的基本思想 如果我们解决一个问题的时候能将一个大问题转换成一个或者若干个规模较小的同等性质的

贪心法 codevs 1052 地鼠游戏

1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结.完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人. 但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽一定的时间让自己玩一下,他的爸爸妈妈也比较信任他的学习能力

C语言(贪心法)

C语言有这样一个规则,每一个符号应该包含尽可能多的字符.也就是说,编译器将程序分解成符号的方法是,从左到右一个一个字符地读入,如果字条可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分,如果可能,继续读入下一个字条,重复上述判断,直到读入的字符组成的字符串已经不再可能组成一个有意义的符号.这个处理的策略被称为"贪心法".需要注意的是,除了字符串与字符常量,符号的中间不能嵌有空白(空格.制表符.换行符等). 看一下下面的代码:想一下输出

贪心法-c语言的规则

在面试的过程中,有很多的考验对c的认识的情况,有时会被问到有关字符搭配以及运算先后顺序的问题,比如a+++++b的值,++i+++i+++i+i的值等类似的,这都属于c的符号方面的问题,那么怎样才能轻而易举的去认识它呢? c语言有这样的一个规则:那就是传说中的贪心法,规则是这样定的:每个符号应该包含尽可能多的字符,也就是说,我们的编译器将程序分解成符号的方法是,从左到右一个一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,然后在判断已经读入的两个字符是否有可能是一个符号或者一个符

ACM:贪心法:乘船问题。

题目:有n个人,第i个人的重量为wi,每艘船的最大载重量均为C,且最多只能乘两个人.用最少的船装载所有人. 分析:贪心法! 考虑最轻的人i,他应该和谁一起坐呢?如果每个人都无法和他一起坐船,那么唯一的方案就是每个人坐一艘船! 否则,他应该选择能和他一起坐船的人中最重的一个j. 这样的方法是贪心的!因为:它只是让"眼前"的浪费最少. 程序实现:我们只需用两个下标i和j分别表示当前考虑的最轻的人和最重的人,每次先将j往左移动,直到i和j可以共坐一艘船,然后i加1,j减1.并且重复上述操作!