目录
1.基本介绍
1.1 基本思想
- 动态规划(Dynamic Programming),又叫表格法
- 核心思想:
- 将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法
- 是多阶段决策过程,每步的求解问题是后面阶段求解问题的子问题,用前面问题的结果来做后面问题的及决策,每步决策将依赖于以前步骤的决策结果;
- 过程:
- 拆分:将一个复杂问题拆分成一系列的简单子问题,每一次解决一个子问题并将其结果存储起来,理想情况下用基于内存的数据结构
- 查找:在下一次遇到相同的子问题的时候,直接查找之前计算过的结果而不是重新计算,理想情况下,使用这种方法可以以适当的增大内存占用为代价节省计算时间
- 记忆化:存储子问题的答案以避免从新计算的技术叫做记忆化
1.2 与分治法做比较
- 相同点:
- 与分治方法相似,都是通过组合子问题的解来求解原问题的解
- 区别:
- 分治方法:子问题互不相交,子问题之间是相互独立的
- 动态规划:子问题有重叠,即不同的子问题具有公共的子子问题,经分解得到子问题往往不是互相独立的,即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解
1.3 动态规划求解问题
通常求解:
- 最优化问题 (有很多可行解,每个解都有值,我们希望寻找最小或者最大值)
适用条件:
- 满足优化原则,即一个最优决策序列的任何子序列本身一定是相对于于子序列的初始和结束状态的最优决策序列
两个要素:
- 最优子结构和子问题重叠
- 最优子结构:
- 一个问题的最优解包含其子问题的最优解,使用动态规划方法时,我们用子问题的最优解来构造原问题的最优解
发掘最优子结构的通用模式:
- 1.证明问题最优解的第一个组成部分是做出一个选择,做出这次选择会产生一个或多个待解的子问题
- 2.对于一个给定问题,在其可能的第一步选择中,你假定已经知道哪种选择才会得到最优解。你现在并不关心这种选择是如何得到的,只是假定已经知道了这种选择。
- 3.给定可获得最优解的选择后,你确定这次选择会产生哪些子问题,以及如何最好地刻画子问题空间
- 4.作为原问题最优解的组成部分,每个子问题的就是它本身的最优解
子问题重叠:
- 导致直接递归的时间复杂度是指数级的,动态规划的方法是付出额外的内存空间来节省计算时间,对每个子问题只求解一次,并将结果保存下来
自底向上法:
- 将子问题按规模排序,按由小到大的顺序进行求解,当求解某个子问题时,它所依赖的那些更小的问题都已经求解完毕,结果已经保存。每个子问题只需求解一次,当我们求解它时,它的所有前提子问题都已求解完成
实质: