假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
- 输入: 2
- 输出: 2
- 解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
- 输入: 3
- 输出: 3
- 解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
初始思路:首先判断这是个动态规划问题,根据动态规划问题的求解步骤和特点,所以我想将其分解为子问题,例如n=3,从一级台阶开始,第一阶台阶只能走一步,到第二阶台阶,这相当于是两阶台阶问题,可以有两种方式到达,在一级台阶的基础上,再走一级台阶,或者是从地面开始直接走两级台阶,这就有两种方式,再增加一级台阶,每一阶走一步,或者先走2步,再走1步,或者先走1步,再走2步,这样,每增加一级台阶,就会产生特定数量的上台阶方式。用数组dp【i】来存储i个台阶的时候的上台阶方式,那么递推公式是什么呢?这里我没想出来呀!
看了题解的思路点拨,知道了递推公式是dp【i】=dp【i-1】+ dp【i-2】,这和我之前的思路是完全不一样的。
# 上台阶 class Solution1: def shang(self, n: int): dp = [0 for i in range(n)] dp[0] = 1 # 上1级台阶有一种 dp[1] = 2 # 上2级台阶有2种 dp[2] = 3 # 上3级台阶有3种 if n == 0: return 0 elif n == 1: return 1 for i in range(3, n + 1): dp[i-1] = dp[i-2] + dp[i-3] print(dp) return dp[-1] s = Solution1() print(s.shang(5))
输出结果:
[1, 2, 3, 0, 0]
[1, 2, 3, 5, 0]
[1, 2, 3, 5, 8]
8
对答案之后发现这种写法可以进一步调整如下:主要是更改了dp【0】
class Solution2: def shang2(self, n: int): dp = [0 for i in range(n+1)] dp[1] = 1 # 上2级台阶有2种 dp[2] = 2 # 上3级台阶有3种 if n <= 1: return n for i in range(3, n+1): print(i) dp[i] = dp[i-1] + dp[i-2] print(dp) return dp[-1] s = Solution2() print(s.shang2(5))
输出为:
3
[0, 1, 2, 3, 0, 0]
4
[0, 1, 2, 3, 5, 0]
5
[0, 1, 2, 3, 5, 8]
8
以上就是全部的题解