联系

分治、动态规划、贪心算法都是把一个大的问题给分解成子问题,通过解决子问题来最终解决原问题的。

区别

分治: 子问题不重复时候更适合,重复也能用,效率低,最好动态规划。
动态规划: 重复的公共子问题和最优子结构,记录已经计算过的子问题,用空间换时间。在动态规划中,每一步都要做出选择,但是这些选择依赖于子问题的解
贪心: 能用贪心解决的都能用动态规划解决,自顶向下,不等所有子问题求解完毕再选择使用哪一个的解,而是直接人为的通过一种策略选择一个子问题去求解。
回溯: 深度搜索+剪枝思想,能用贪心 动态解决的都能用回溯解决

分治

大部分分治也是求子问题的最优解,不过也有不是的。

算法步骤:
分解(Divide):将原问题分解成一系列子问题;
解决(conquer):递归地解各个子问题。若子问题足够小,则直接求解;
合并(Combine):将子问题的结果合并成原问题的解。
重点是:写递归方程
分治法求解的经典案例有:快速排序,归并排序,二分搜索等

动态规划

算法步骤:
重点是:写转移方程
例如经典数塔问题,用自底向上的动态规划,上一层的每个结点都会从它所有子结点中选择最大的,这样依次递推,到第一层的右下和左下,各自的最大和必定为其路径的最大和。

贪心

贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策略的选择,根据不同的问题选择不同的策略。

必须注意的是策略的选择必须具备无后效性,即前面选择什么对后面没影响,A B C三个字母选择两个,有后效性只能选AB AC,无后效性可以AA AB AC。

步骤:

1.明确什么是最优解
2.明确子问题的最优解策略,即选择一个策略来解决子问题
3.分别求出子问题的解堆叠成最终解

经典例题:爬楼,一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。