一、跳台阶问题
问题描述:一个人走上台阶,每次可以上1阶台阶或2阶台阶,求总共有多少种走法。
解法1:递归法
递归法是最直观的方法,但是在实际应用中可能会超时。
def f(n, m):
if n == 0:
return 1
if m == 0:
return 0
return f(n-1, m) + f(n-2, m)
n = int(input("请输入台阶数量:"))
m = int(input("请输入每次可以上的台阶数(1 or 2):"))
print(f(n, m))
解法2:动态规划
递归法的时间复杂度是指数级的,因此我们需要使用动态规划的方法来减少时间复杂度。
def f(n, m):
dp = [0 for _ in range(n+1)]
dp[0] = 1
for i in range(1, n+1):
if i >= m:
dp[i] = dp[i-m]
else:
dp[i] = 0
if m > 1 and i >= m+1:
dp[i] += dp[i-m*2]
return dp[n]
n = int(input("请输入台阶数量:"))
m = int(input("请输入每次可以上的台阶数(1 or 2):"))
print(f(n, m))
解法3:数学方法
我们可以通过组合数学的方法来求解。设台阶总数为n,每次可以上的台阶数为m,则有:
如果m=1,则有f(n)=f(n-1)
如果m=2,则有f(n)=f(n-2)+f(n-1)
因此,我们可以使用以下代码来求解:
def f(n, m):
a, b = 1, 0
for i in range(n):
a, b = b, a + b
if m > 1:
b += a
return a
n = int(input("请输入台阶数量:"))
m = int(input("请输入每次可以上的台阶数(1 or 2):"))
print(f(n, m))
以上就是三种解法,分别是递归法、动态规划和数学方法。在实际应用中,应优先选择时间复杂度较低的方法。
二、变态台阶问题
对于变态台阶问题,我们可以在递归解法中加入一个额外的参数来处理变态的情况。
解法1:递归解法
def variableClimbStairs(n, k):
if n <= 1:
return 1
return variableClimStairs(n-1, k) + variableClimStairs(n-k-1, k)
解法2:动态规划解法
def variableClimbStairs(n, k):
if n <= 1:
return 1
dp = [0 for _ in range(n+1)]
dp[0] = 1
for i in range(1, n+1):
for _ in range(k):
if i - k - 1 >= 0:
dp[i] += dp[i-k-1]
return dp[n]