n级台阶,每次前进1~m级,共有几种走法?

leetcode上其实有类似的题目,不过那道题每次只会爬1或2级台阶。这道题属于升级版爬楼梯问题,但解决方法其实类似,只要自己把逻辑捋顺很容易写出来。我今天面试就是有点紧张,导致下文sum值的设置没想明白卡了一会,面试官可能觉得我不会写就给我换了个题(哭)。

这里介绍动态规划的解决方法。对于第k(k<=n)级台阶的爬法我们可以分解成前min(m, k-1)级台阶的方法数之和(表示从前min(m, k-1)级台阶直接跨到第k级台阶。若k<=m,则另外加1表示一步跨到第k级台阶)。

同时我们可以储存子问题的解以避免重复计算从而大大提高运行效率。一个比较取巧的方法是维护一个整数sum作为前min(m, k-1)级台阶方法数之和。这样,当k<=m时,我们可以令第k级台阶的走法个数result[k]=sum+1, sum+=(sum+1);k>m时result[k]=sum, sum+=(sum-result[k-m]):

def ClimbStairs(n=30, m=10):
    result = []
    sum = 0
    for i in range(n): # 这里用i表示k-1
        if i < m:
            result.append(sum+1)
            sum += result[i]
        else:
            result.append(sum)
            sum += result[i]-result[i-m]
    return result[n-1]
print(ClimbStairs())

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值