这道题花了蛮久时间,刚开始接触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的方法,将问题分解为子问题。
状态定义:
表示到梯子的第
层,到达第
层的状态有两种方法:
- 从状态 走一步到达
- 从状态 走两步到达
表示到第 层的所有方法
状态转移方程:
你会觉得这个方程非常眼熟,它就是著名斐波那契数列表达式,只需再加一个条件 。只是在这个题目中起始的两个数是 而不是 。
代码如下:
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
知乎关于动态规划的回答