**一个问题必须拥有重叠子问题和最优子结构,才能使用动态规划。**
一、动态规划与分治
两者都是将问题分解为子问题,然后合并子问题的解,从而得到原问题的解。
分治:分解的子问题是不重叠的。例如快速排序和归并排序,每个子问题即需要排序的序列都是不同的。且分治法解决
的问题不一定是最优化问题。
动态规划:重叠子问题,例如经典数塔问题,要求从第i行第j个数字出发的到达最底层的所有路径中能得到的最大和,
就一定要先求出它的两个子问题——从位置(i+1,j)到达底层的最大和及从位置(i+1,j+1)到达底层的最大和。重复的求
各子问题的最优解。
二、动态规划与贪心
两者都要求原问题必须拥有最优子结构,即重复求子问题最优解。
贪心:自顶向下,不等所有子问题求解完毕再选择使用哪一个的解,而是直接人为的通过一种策略选择一
个子问题去求解。没被选择的子问题不再求解,直接抛弃。例如经典数塔问题,用贪心的话,会直接从第一层的左下
和右下选择较大的一个,较小的不再考虑,即使较小的那一个路径上的结点值都比,较大的路径上的结点值大。所以
从全局看,不一定可以得到最优解。
动态规划:无论是选择自顶向下还是自底向上,总是会考虑所有子问题,并选择继承能得到最优结果的那
一个。例如经典数塔问题,用自底向上的动态规划,上一层的每个结点都会从它所有子结点中选择最大的,这样依
次递推,到第一层的右下和左下,各自的最大和必定为其路径的最大和。