这道题花了蛮久时间,刚开始接触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.
Example 2: Input: 3 Output: 3 Explanation: There are three ways to
climb to the top.
本题的Solution有提供非常详细的分析说明,可以参考下面提供的地址。
这里使用DP的方法,将问题分解为子问题。
状态定义:
i i 表示到梯子的第 i i 层,到达第 i i 层的状态有两种方法:
f[i] f [ i ] 表示到第 i i 层的所有方法
状态转移方程:
f[i]=f[i−1]+f[i−2] f [ i ] = f [ i − 1 ] + f [ i − 2 ]
你会觉得这个方程非常眼熟,它就是著名斐波那契数列表达式,只需再加一个条件 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
知乎关于动态规划的回答