题目内容
小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 下,有多少种不同的走法。状态转移方程的推导和初始化是关键步骤,确保每一步的走法都符合题目中的限制条件。