📅  最后修改于: 2023-12-03 14:49:54.168000             🧑  作者: Mango
假设有一个楼梯,有n级台阶。每次可以迈上1步、2步或者3步,问走完n级台阶有多少种不同的走法。
这是一个典型的动态规划问题。
我们设 $f(n)$ 表示走到楼梯第 $n$ 级台阶的不同走法总数。
对于走到的当前楼梯的级数,我们有三个选择:走 1 步、走 2 步或者走 3 步。因此,我们可以得到状态转移方程:
$f(n) = f(n-1) + f(n-2) + f(n-3)$
其中,初始状态为:
$f(1) = 1, f(2) = 2, f(3) = 4$
时间复杂度为$O(n)$,空间复杂度为$O(n)$。
代码实现如下:
def climbStairs(n: int) -> int:
if n <= 0:
return 0
if n == 1:
return 1
if n == 2:
return 2
if n == 3:
return 4
dp = [0] * (n+1)
dp[1], dp[2], dp[3] = 1, 2, 4
for i in range(4, n+1):
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
return dp[n]
事实上,对于这种问题,还存在一种更加简洁的解法。
分析问题可知,对于一个长度为 $n$ 的跳跃序列,我们可以把它分解为一个长度为 $n-1$ 的跳跃序列再跳 1 步,或者一个长度为 $n-2$ 的跳跃序列再跳 2 步,或者一个长度为 $n-3$ 的跳跃序列再跳 3 步。
这就是一个斐波那契数列,根据斐波那契数列的定义,我们可以得到状态转移方程:
$f(n) = f(n-1) + f(n-2) + f(n-3)$
其中,初始状态为:
$f(1) = 1, f(2) = 2, f(3) = 4$
时间复杂度为$O(n)$,空间复杂度为$O(1)$。
代码实现如下:
def climbStairs(n: int) -> int:
if n <= 0:
return 0
if n == 1:
return 1
if n == 2:
return 2
if n == 3:
return 4
a, b, c = 1, 2, 4
for i in range(4, n+1):
a, b, c = b, c, a+b+c
return c
本题是一个经典的动态规划问题,可以使用递归、记忆化搜索或者迭代式动态规划等不同的方法求解。在本题中,使用迭代式动态规划的思想可以让计算时间和空间复杂度得到优化,代码实现也更加简单和高效。