有限制的楼梯攀登 | 豆包MarsCode AI刷题

44 阅读3分钟

题目内容

小U最近决定挑战一座非常高的楼梯,每次他可以选择走一步或两步,但有一个重要的限制:他不能连续走两步。因此,小U想知道他总共有多少种不同的方式可以从楼梯的底部走到顶端。

你需要帮他计算在给定的楼梯层数下,小U有多少种走法。

题目分析

解题思路

1. 问题理解

  • 楼梯层数:给定一个整数 n,表示楼梯的总层数。
  • 走法限制:每次可以选择走一步或两步,但不能连续走两步。

2. 状态定义

我们可以使用动态规划来解决这个问题。定义两个状态:

  • dp[i][0]:表示到达第 i 层时,最后一步是走一步的情况。
  • dp[i][1]:表示到达第 i 层时,最后一步是走两步的情况。

3. 初始化

  • dp[1][0] = 1:表示第一层只能通过走一步到达。
  • dp[2][0] = 1:表示第二层可以通过走一步到达。
  • dp[2][1] = 1:表示第二层可以通过走两步到达。

4. 状态转移方程

  • dp[i][0] = dp[i-1][0] + dp[i-2][0]:表示到达第 i 层时,最后一步是走一步的情况,可以从第 i-1 层走一步到达,或者从第 i-2 层走一步到达。
  • dp[i][1] = dp[i-2][0]:表示到达第 i 层时,最后一步是走两步的情况,只能从第 i-2 层走两步到达。

5. 最终结果

  • 最终结果是 dp[n][0] + dp[n][1],即到达第 n 层的所有可能走法。

例子分析

例子1:n = 2

  • dp[1][0] = 1:第一层只能通过走一步到达。
  • dp[2][0] = 1:第二层可以通过走一步到达。
  • dp[2][1] = 1:第二层可以通过走两步到达。

最终结果:dp[2][0] + dp[2][1] = 1 + 1 = 2

例子2:n = 3

  • dp[1][0] = 1:第一层只能通过走一步到达。
  • dp[2][0] = 1:第二层可以通过走一步到达。
  • dp[2][1] = 1:第二层可以通过走两步到达。
  • dp[3][0] = dp[2][0] + dp[1][0] = 1 + 1 = 2:第三层可以通过走一步到达。
  • dp[3][1] = dp[1][0] = 1:第三层可以通过走两步到达。

最终结果:dp[3][0] + dp[3][1] = 2 + 1 = 3

例子3:n = 4

  • dp[1][0] = 1:第一层只能通过走一步到达。
  • dp[2][0] = 1:第二层可以通过走一步到达。
  • dp[2][1] = 1:第二层可以通过走两步到达。
  • dp[3][0] = dp[2][0] + dp[1][0] = 1 + 1 = 2:第三层可以通过走一步到达。
  • dp[3][1] = dp[1][0] = 1:第三层可以通过走两步到达。
  • dp[4][0] = dp[3][0] + dp[2][0] = 2 + 1 = 3:第四层可以通过走一步到达。
  • dp[4][1] = dp[2][0] = 1:第四层可以通过走两步到达。

最终结果:dp[4][0] + dp[4][1] = 3 + 1 = 4

参考代码

def solution(n):
    # 定义二维列表 dp 来存储状态
    dp = [[0 for _ in range(2)] for _ in range(n + 1)]
    # 初始化第一层和第二层的走法数量
    dp[0][0] = 1
    dp[1][0] = 1  # 表示第一层走一步到达

    for i in range(2, n + 1):
        dp[i][0] = dp[i-1][0]+dp[i-1][1]
        dp[i][1] = dp[i-2][0]

    return dp[n][0] + dp[n][1]

总结

通过动态规划的方法,我们可以有效地计算出小U在给定楼梯层数 n 下,有多少种不同的走法。状态转移方程的推导和初始化是关键步骤,确保每一步的走法都符合题目中的限制条件。