LeetCode Climbing Stairs(经典动态规划)

来源:互联网 发布:知乎 发哥 编辑:程序博客网 时间:2024/06/01 12:27

传送门:

https://leetcode.com/problems/climbing-stairs/

题目大意:

题意很简单易懂,有N阶楼梯,每步只能跨一阶或者两阶,问有多少种走法。

解题思路:

这是一道很老的面试题目了,记得还在大二的时候我的C++老师曾拿这道题目来考我们班的同学,数据范围已经确定(N<=50)。我能想到的方法是组合数学,1 * x + 2 * y == 50,枚举x,排列组合,求和得到结果。当时十分钟敲完代码并且运行正确觉得自己很牛逼,现在再次看到这道题目,只能说那个时候自己年少无知。
现在再来看这道题目,怎么看都是个动态规划。当你站在第i阶台阶的时候,就只能从第i-1阶台阶或者第i-2阶台阶跨上来。所以,就有了递推公式dp[i] = dp[i - 1] + dp[i - 2]。

总结:

是不是很像斐波拉契?答案是肯定的。从斐波拉契看动态规划,斐波拉契数列是从已知状态推导到未知状态,恰恰动态规划也是这样。

动态规划推导过程:

1.构造需要推导的最终状态。
2.构造初始状态。
3.想方设法利用已知条件从已知状态推导到未知状态。
4.写出递推方程。
可能这些过程说起来比较轻松,做起来就比较困难了。所以,这里面需要大量的练习,尤其是思维的训练。

Show me the code:

/** * @param {number} n * @return {number} */var climbStairs = function(n) {    var arr = [1, 2];    if (n <= 2) return arr[n - 1];    var index = 1;    for (var a = 3; a <= n; ++a) {        arr[index ^ 1] = arr[index] + arr[index ^ 1];        index ^= 1;    }    return arr[index];};
0 0
原创粉丝点击