说明:本篇笔记基于python语言写出
有限制的楼梯攀登
问题描述
小U最近决定挑战一座非常高的楼梯,每次他可以选择走一步或两步,但有一个重要的限制:他不能连续走两步。因此,小U想知道他总共有多少种不同的方式可以从楼梯的底部走到顶端。
你需要帮他计算在给定的楼梯层数下,小U有多少种走法。
代码思路
小U每次可以选择走一步或两步,但不能连续走两步。我们需要计算从楼梯底部到顶端的不同走法数量。
我们可以使用动态规划来解决这个问题。动态规划的核心思想是将问题分解为子问题,并存储子问题的解以避免重复计算。
我们定义 dp[i] 为到达第 i 层楼梯的不同走法数量。
根据题意,小U不能连续走两步,因此:
- 如果最后一步是走一步,那么前一步不能是走两步,即
dp[i] += dp[i-1]。 - 如果最后一步是走两步,那么前一步必须是走一步,即
dp[i] += dp[i-3]。
初始条件
dp[0] = 1:表示在地面,不需要走。dp[1] = 1:只有一种走法,走一步。dp[2] = 2:两种走法:1+1或2。
解答
def solution(n):
if n == 0:
return 1
if n == 1:
return 1
if n == 2:
return 2
dp = [0] * (n + 1)
dp[0] = 1
dp[1] = 1
dp[2] = 2
for i in range(3, n + 1):
dp[i] = dp[i - 1] + dp[i - 3]
return dp[n]
if __name__ == "__main__":
print(solution(2) == 2)
print(solution(3) == 3)
print(solution(4) == 4)
个人思考
- 在实现代码时,需要注意边界条件处理、数组越界等问题。
- 应用:在代码中,我们单独处理
n为 0、1 或 2 的特殊情况,并确保在计算dp[i]时,i的值在有效范围内。
总结
这道题运用了以下知识点,还需多多学习
-
动态规划(Dynamic Programming) :
- 概念:动态规划是一种通过将问题分解为子问题,并存储子问题的解以避免重复计算的算法设计技术。
- 应用:在这道题中,我们使用动态规划来计算到达每一层楼梯的不同走法数量。
-
状态定义:
- 概念:在动态规划中,状态是指问题的子问题的解。
- 应用:我们定义
dp[i]为到达第i层楼梯的不同走法数量。
-
状态转移方程:
- 概念:状态转移方程描述了如何从一个状态转移到另一个状态。
- 应用:在这道题中,状态转移方程为
dp[i] = dp[i - 1] + dp[i - 3],表示到达第i层的走法数量等于到达第i-1层的走法数量加上到达第i-3层的走法数量。
-
初始条件:
- 概念:初始条件是动态规划的基础,用于初始化状态数组。
- 应用:在这道题中,初始条件为
dp[0] = 1、dp[1] = 1、dp[2] = 2,确保了后续计算的正确性。
-
边界条件处理:
- 概念:边界条件处理是指在代码中单独处理特殊情况,避免数组越界等问题。
- 应用:在这道题中,我们单独处理
n为 0、1 或 2 的特殊情况,直接返回对应的走法数量。
-
数组操作:
- 概念:数组是一种数据结构,用于存储一系列元素。
- 应用:在这道题中,我们使用数组
dp来存储每个楼梯层数的走法数量。
-
循环结构:
- 概念:循环结构用于重复执行一段代码。
- 应用:在这道题中,我们使用
for循环从第 3 层开始,计算每一层的走法数量。