走楼梯问题
动态规划简介:
问题描述:
- 假设小明要走一个n级的楼梯,一步走一级或者一步走两级,问他走到顶有多少种方法。
- 举个例子,他可以每次走一步,那么他走了10步;他也可以一次走两步,他走了5步;解题的人要找到所有走的方案。
解题思路:
- 假设 n = 10
- 如果我们从第一步开始看,第一步可能走一级或者两级,第二步也可能会走一级或者两级,这样不断的去计算会显得非常复杂,那么我们不妨从后往前看。
- 现在假设已经走到了最后一步,小明只需要跨一步就可以走到第十级,那么此时小明可能站在第八级的上面或者站在第九级的上面
- 那么如果我们已经知道走到第八级有X种走法,走到第九级有Y种走法,则走到第十级的走法就是X + Y
- 设F(n)为走到n级的走法数,那么F(10) = F(8) + F(9),那么推广到一般的情况就是F(n)= F(n-1)+ F(n -2)
- 此时动态规划的三要素就全部出现了:
- 状态转移方程:F(n)= F(n-1)+ F(n -2)
- 边界就是最小子问题:即F(1) = 1, F(2) = 2
- 最优子结构:F(n-1), F(n -2)
注意:这一题其实是非常简单的一道题目,实际上并没有用到备忘录的设计,但是主要的思想其实就是划分相互交叠的子问题,记录计算结果,进行状态转移
具体实现:
public static int runSteps(int n){if(n < 0) return 0;if(n &#61;&#61; 1) return 1;if(n &#61;&#61; 2) return 2;return runSteps(n-1) &#43; runSteps(n-2);}