动态规划
动态规划与分治方法相似,都是通过组合子问题的解来求解原问题。
动态规划是分治方法的特例,应用于子问题重叠的情况。在这种情况下,分治算法会反复求解这些重叠的子问题。而动态规划算法对每个子问题只求解一次,将其解保存下来,而无需每次都计算。
动态规划的实现有两种形式:递推形式和递归形式。
递推形式的动态规划
通常采用自底往上的方法。
缺点
- 有时候状态之间的依赖关系不明显。
- 可能会计算到无用状态。
递归形式的动态规划(记忆化搜索)
在分治算法的基础上,把计算过的子问题的解保存下来,再次处理这个子问题时直接输出保存下来的解。
优点
- 不用重新考虑状态之间的依赖关系,在分治代码的基础上简单改动即可。
- 只有需要用到某个状态才会计算,不会计算无用状态。
缺点
- 无用状态不多或没有时,比递推开销大,运行慢。
两种实现形式的选择
有些题目只能用记忆化搜索,有些题目只能用递推。
有些题目这两种形式都可以用,选择方法如下:
- 当无用状态多的时候,用记忆化搜索。
- 当无用状态不多,依赖关系明显的时候,用递推。
- 以上两种都不是的时候,优先选择记忆化搜索。