动态规划算法:基本思想是将一个问题分解为若干个子问题,对每个子问题求得最优解,并最终通过特定的结构串成大问题的最优解.(我们通常采用“自底朝上”的“备忘录”法和“从顶朝下”的逆推法方式找出关系式,同时已知首项的值进行求解。)
解题步骤:Ⅰ.理解子问题的含义与其最优解的构造,并且刻画其结构特征(应当定义一个数组来保存历史数据).
Ⅱ.找出前后项的递归/递推(☆)关系式,并保存在相应的数组中.
Ⅲ.找出初始值,并储存在数组首项中;最终可通过Ⅱ中的关系式得出原题的最优解.
法一:“备忘录”法
(例:杭电OJ2041-超级楼梯)
![](https://img-blog.csdnimg.cn/img_convert/610c3153f9110cca637236bb737d088b.png)
题干分析:要计算到达某阶级的总方案数数,先设到达n级的总方案为f(n),而因每一只能走1级或2级,则f(n)的大小应为第(n-1)级与第(n-2)级的方案数之和,即f(n)=f(n-1)+f(n-2).
但是当我们使用(暴力)递归时,即从顶部推回到底部(f(2)=1,f(3)=2)的方案数时,往往因为计算量过大而超时;所以我们可以采用“自底朝上”的方式,对于递增的每一级方案数进行“备忘录”式的保存,最终顺利得出第n级的方案总数!
进阶版——(例:杭电OJ2059-龟兔赛跑)
![](https://img-blog.csdnimg.cn/img_convert/e5314c8988d293b6e99fb685d9423c42.png)