动态规划满足的 基本条件是:
1. 最优子结构
当一个问题的最优解包含了子问题的最优解时,说明这个问题具有最优子结构的特性。
那么如何判断一个问题是否具有这个属性呢?
我们可以通过数学上常用的反证法来证明,假设子问题的解不是最优的,那么该问题的解还是最优的吗?如果不是,那么说明这个问题满足最优子结构的特性,但是,满足了最优子结构特性,也不能说明该问题可以用动态规划来解决问题。我们知道,贪心发也满足最有子结构。
贪心算法和动态规划的区别:
动态规划是自底向上,会保存每个子问题的最优解,在没有搜索完整个空间时是不知道哪个子问题的最优解才会构成整个问题的最优解,贪心算法是局部最优的形式作出选择,他不会保留子问题的解,这样一来贪心算法要明显快于动态规划。
2.子问题相互独立
一个子问题的解不会影响同一个问题的另一个子问题的解,就是指这两个子问题中不会有共同的数据集。
将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。
3.重叠子问题
不同的子问题i会有很多重叠的子问题,因此在求解过程用空间来换取时间
动态规划算法的四个设计步骤:
1.描述最优解的结构
2.递归定义最优解的值
3.按自底向上的方式构造最优解
备忘录方法:
采用自顶向下的策略,具有动态规划的效率,想动态规划一样记录子问题的解,同时利用递归算法,是程序逻辑变得简单。