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())