相同点:将问题划分为一个个子问题,然后通过解决这些子问题来解决最终问题。
1.分治算法:
- 分解(Divide):将原问题分解成一系列子问题;
- 解决(conquer):递归地解各个子问题。若子问题足够小,则直接求解;
- 合并(Combine):将子问题的结果合并成原问题的解
应用:归并排序;
2.贪心算法:贪心算法中,是以自顶向下的方式使用最优子结构的。贪心算法会先做选择,在当时看起来是最优的选择,然后再求解一个结果子问题,而不是先寻找子问题的最优解,然后再做选择。
解动态规划问题一般是自底向上,从小子问题处理至大子问题。
条件:每一步的最优解一定依赖上一步的最优解。
方法:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止
哈夫曼树,钱币组合,设置雷达问题;不能用来求最大最小解的问题;
3.动态规划算法:
- 描述最优解的结构
- 递归定义最优解的值
- 按自底向上的方式计算最优解的值
- 由计算出的结果构造一个最优解
条件:最优子结构;重叠子问题。
方法:自底向上构造子问题的解。
应用:子序列最大和问题,滑雪问题
为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。
分治法是指将问题划分成一些独立地子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解。与此不同,动态规划适用于子问题独立且重叠的情况,也就是各子问题包含公共的子子问题。
用表记录子问题的解的,就是动态规划。动态规划可以用递归和两层for循环来实现。
不用表记录子问题的,就是分治法。分治法只能用递归调用来实现。