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.写出递推方程。
可能这些过程说起来比较轻松,做起来就比较困难了。所以,这里面需要大量的练习,尤其是思维的训练。
/**
* @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];
};