题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
个人思路:
这就是一道非常经典的动态规划的题目了。对于第n阶楼梯来说,无非有两种途径到达,第一种是从第n-1阶楼梯,爬1个台阶上来,第二种则是从第n-2阶楼梯,爬2个台阶上来。由此,我们不难得出动态规划的三个重要问题的结果:
- 状态定义:dp[i]可以定义为到第i个台阶的方法数,这里的状态定义实际也就是待求问题。
- 状态转移方程:dp[i] = dp[i-1] +dp[i-2]
- 初始化:由于状态转移方程里面涉及到前两个数,因此最初的dp[0]以及dp[1]需要进行相应的初始化
具体代码如下:
class Solution:
def climbStairs(self, n: int) -> int:
if n <= 0:
return -1
dp = [1] * n # 状态定义:dp[i]表示到i阶楼梯的方法数
dp[1] = 2 # 初始化
for i in range(2, n):
dp[i] = dp[i - 1] + dp[i - 2] # 状态转移方程
return dp[-1]