1. 推荐阅读
- 漫画:什么是动态规划?
http://www.sohu.com/a/153858619_466939 - 进一步理解动态规划 - 简书
https://www.jianshu.com/p/69669c7bd69e
2. 什么是动态规划
动态规划是一种分阶段求解决策问题的数学思想。简单来说,就是“大事化小,小事化了”,把一个复杂的问题分阶段进行简化,逐步化简成简单的问题。
- 假定一种状态可以做出多种决策,而每一种决策可以产生一种新的状态;
- 最优决策是在最后阶段形成的,然后往前倒退,直到初始阶段;
- 而决策的具体结果及所产生的状态转移,是由初始阶段开始进行计算,然后往后递归或迭代,直到最终结果。
3. 何时用动态规划
- 每个阶段只有一个状态—>递推;
- 每个阶段的最优状态都是由上一个阶段的最优状态得到的—>贪心;
- 每个阶段的最优状态是由之前所有阶段的状态的组合得到的—>搜索;
- 每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的—>动态规划。
4. 问题建模
动态规划中包含3个重要概念:最优子结构、边界、状态转移方程。
下面我们以漫画中的跳台阶为例展开介绍:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
4.1 根据问题,找到【最优子结构】
找到【最优子结构】是把原问题从大化小的第一步,找到比当前问题要小一号的最好的结果,而一般情况下当前问题可以由最优子结构进行表示。
4.2 确定问题的【边界】
根据上述的最优子结构,一步一步从大化小,最终可以得到最小的,可以一眼看出答案的最优子结构,也就是【边界】。如果一个问题没有边界,将永远无法得到有限的结果。
注意:关于【边界】需要仔细考虑,不要凭借主观感觉猜测f(0),应该用f(1),f(2)倒推计算f(0)。
4.3 分析【状态转移方程】
状态转移方程是确定由一个状态到另一个状态的演变过程。通过分析最优子结构与最终问题之间的关系,我们可以得到【状态转移方程】。