回答
分治法解决的问题,把大问题分解成小问题后,这些小问题个个都是需要解决的,都不是重复的,每个都必须解决。(也就是不存在「重复子问题」)
但是动态规划解决的问题不一样,动态规划把大问题分解成小问题后,这些小问题是存在「重复子问题」的(通常都会用备忘录来记录重复子问题的解,从而减少小问题的个数,节省时间和空间)
举例说明
- 分治法
分治法可以用来实现「归并排序」:不断把数组分成两半,然后不断把两半的数组进行 有序合并,在这个过程中,每个子问题都是要解决的,没有重复的地方,不能说你合并了前面一半数组,就不合并后面一半数组。
- 动态规划
动态规划可以用来实现「斐波那契数列」:要求出第 20 位的数值,必须先求出第 19 和 第 18 位的数值,,要求第 19 位的数值必须先求出第 17 和 第 18 位(重复子问题出现了)的数值
图片来自 labuladong 文章,侵权删
动态规划解决的问题是可以剪枝的(去除重复子问题),这就是它跟分治算法的最大区别。
动态规划的最优子结构
其实最优子结构说的就是最优的子问题解,整个问题的最优解由每个子问题的最优解构成。这就要求每个子问题求最优解时互相不影响。
举个例子,现在的问题是给定食物(可乐和曼妥思),尽可能吃掉最多。那如果是两个人吃,肯定是每个人能吃多少吃多少,然后才能求得最优解。
但如果是一个人吃,那这个问题就不存在最优子结构,而是选择一种食物然后吃,因为可乐和曼妥思同时进肚子会撑死人的。