LeetCode Climbing Stairs(经典动态规划)

传送门:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值