动态规划问题
- 算法原理
将复杂的问题分解成若干个简单的子问题,根据这些简单的子问题的解得到原复杂问题的解。 - 关键点
找到子问题原原问题之间的关系:包括最优子结构、重复子问题 - 如何减小问题规模
- 每次减小一半:二分法、折半查找
- 每次减少一个
- 最优子结构
子问题与原问题之间的关系:即原问题的最优解是由它各个子问题的最优解决定的。
这两者之间的联系可以用状态转移方程来描述:
通过该方程便能写出递归解法 - 重复子问题
子问题与子问题之间的关系:当我们求解一个子问题的最优解的时候,可能会需要用到更小的子问题,这些子问题会重叠地出现在子问题里面,则会出现很多的重复计算。
解决此问题的方法如下:- 自顶向下(记忆法)
在递归地求解子问题 f(1), f(2)… 过程中,将结果保存到一个表里,在后续求解子问题中如果遇到求过结果的子问题,直接查表去得到答案而不计算,由于递归的存在,需要额外消耗栈 - 自底向上(迭代)
避免了递归,而是记住每个最小问题规模的解,来避免重复计算,需要明确的迭代方向
- 自顶向下(记忆法)