有n个台阶,青蛙一次只能跳1步到k步,请问有多少种跳法?
这个问题是一个经典的爬楼梯问题,可以使用递推方法解决。
设f[i]表示到达第i层台阶的跳法数,那么到达第i层台阶的跳法数可以由从第i-1,i-2...i-k层台阶跳上来得到,即:
f[i] = f[i-1] + f[i-2] + ... + f[i-k]
当然,这个递推式需要初始化,当i<k时,f[i] = 1,其中,i =1 为起点,f[i]=1.
因此,有n个台阶,青蛙一次只能跳1步到k步的跳法数为f[n]。
代码:
pythondef frog_steps(n, k):
f = [1] + [0] * n
for i in range(1, n+1):
for j in range(1, min(i, k)+1):
f[i] += f[i-j]
return f[n]
print(frog_steps(n=4, k=3))
这里的n表示有n个台阶,k表示青蛙一次可以跳的最多步数。代码中的f数组用来存储到达第i层台阶的跳法数。 使用两个循环,外层循环是遍历到达第i层台阶的所有跳法,内层循环是遍历所有从第i-1,i-2...i-k层台阶跳上来的情况,最终将所有跳法数相加。返回第n个台阶的跳法数。
迭代法可以通过滚动数组来优化空间复杂度,下面是一种实现方式:
pythondef frog_steps_iteration(n, k):
if n < k:
return 1
f = [1] + [0] * k
for i in range(k+1, n+1):
f[i % (k+1)] = sum(f[(i-j) % (k+1)] for j in range(1, k+1))
return f[n % (k+1)]
print(frog_steps_iteration(n=4, k=3))
这里与递推类似,不同的是我们使用一个滚动数组f[i % (k+1)], 来存储到达第i层台阶的跳法数。空间复杂度是O(k),这里的n表示有n个台阶,k表示青蛙一次可以跳的最多步数。使用一个循环,遍历所有从第i-1,i-2...i-k层台阶跳上来的情况,最终将所有跳法数相加。返回第n个台阶的跳法数。
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!