这道题花了蛮久时间,刚开始接触DP,需要多一些思维训练。
题目:
**You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?**
Note: Given n will be a positive integer.
Example 1: Input: 2 Output: 2 Explanation: There are two ways to
climb to the top.- 1 step + 1 step
- 2 steps
Example 2: Input: 3 Output: 3 Explanation: There are three ways to
climb to the top.- 1 step + 1 step + 1 step
- 1 step + 2 steps
- 2 steps + 1 step
本题的Solution有提供非常详细的分析说明,可以参考下面提供的地址。
这里使用DP的方法,将问题分解为子问题。
状态定义:
i
i
表示到梯子的第层,到达第
i
i
层的状态有两种方法:
- 从状态 走一步到达
- 从状态 i−2 i − 2 走两步到达
f[i] f [ i ] 表示到第 i i 层的所有方法
状态转移方程:
你会觉得这个方程非常眼熟,它就是著名斐波那契数列表达式,只需再加一个条件 i>=2 i >= 2 。只是在这个题目中起始的两个数是 [1,2] [ 1 , 2 ] 而不是 [1,1] [ 1 , 1 ] 。
代码如下:
class Solution: def climbStairs(self, n): """ :type n: int :rtype: int """ if n == 0 or n==1 or n==2: return n # f[i] = f[i-1] + f[i-2] ; f[1]=1,f[2]=2 f = list(range(n+1)) f[1]=1 f[2]=2 for i in range(3,n+1): f[i] = f[i-1] + f[i-2] return f[n]
参考链接:
Leetcode Solution
知乎关于动态规划的回答