题目
'''
Description: 70.爬楼梯
Autor: 365JHWZGo
Date: 2021-12-01 10:39:11
LastEditors: 365JHWZGo
LastEditTime: 2021-12-01 11:00:25
'''
直观解题思路
进阶版:由于每次只能走1步或2步,,其实只需要保留前两步有多少种方案的信息就足够了
具体思路
1.确定dp数组以及其含义
dp[i]:在到达第i阶台阶时一共有dp[i]种方法
2.确定递推公式
dp[i]=dp[i-1]+dp[i-2]
3.初始化dp数组
dp[1]=1
dp[2]=2
4.确定遍历顺序
从前往后遍历
5.举例推导
n=4
i 0 1 2 3 4
dp[i] 1 2 3 5
代码1
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n<=2:
return n
dp = [0 for _ in range(n+1)]
dp[1]=1
dp[2]=2
for i in range(3,n+1):
dp[i]=dp[i-1]+dp[i-2]
return dp[-1]
运行结果1
代码2
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n<=2:
return n
dpf=1
dps=2
for i in range(3,n+1):
dpf,dps = dps,dpf+dps
return dps
运行结果2
代码3:使用多重背包思想
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
dp = [0 for _ in range(n+1)]
dp[0] = 1
#先遍历容量
for j in range(n+1):
#再遍历物品
for i in range(1,3):
if j>=i:
dp[j]+=dp[j-i]
return dp[-1]
运行结果3
总结
很像刚开始写的斐波那契数,理解了动态规划写这个不是很难。