代码随想录|第九章 动态规划part01 509.斐波那契数 70.爬楼梯 746.使用最小花费爬楼梯
python
一、理论基础
1.动态规划结题步骤
1 确定dp数组(dp table)以及下标的含义
2 确定递推公式
3 dp数组如何初始化
4 确定遍历顺序
5 举例推导dp数组
一、509.斐波那契数
1.代码
代码如下(示例):
class Solution:
def fib(self,n):
if n==0:
return 0
if n==1:
return 1
dp=[0]*(n+1)
dp[0]=0
dp[1]=1
for i in range(2,n+1):
dp[i]=dp[i-1]+dp[i-2]
return dp[n]
if __name__=="__main__":
n=int(input())
solution=Solution()
result=solution.fib(n)
print(result)
n=0的特殊情况的问题,如果没有n==0,则在n=0情况下,range(2,1)代码有问题
二、70.爬楼梯
70.爬楼梯
没思路,感觉有难度
关键点:明确dp的含义:是方法数目
明确传递的关系,即dp[i]和dp[i-1]及之前的关系,翻译到含义是第i阶梯的方法怎么由第i-1或之前的阶梯的方法数目推的,明确了这个后面才能有思路
1.代码
代码如下(示例):
class Solution:
def climbStairs(self,n):
if n==1:
return 1
dp=[0]*(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[n]
if __name__=="__main__":
n=int(input())
solution=Solution()
result=solution.climbStairs(n)
print(result)
掌握了思想后,代码没有什么难度的。
注意边界条件,n+1,注意range的起始条件
三、746.使用最小花费爬楼梯
746.使用最小花费爬楼梯
大体dp思路有了,但是初始条件,和限制条件仍然没有掌握
1.代码
代码如下(示例):
class Solution:
def minCostClimbingStairs(self,cost):
n=len(cost)
dp = [0]*(n+1)
if n==0:
dp[0]=0
return
dp[1]=0
dp[2]=min(cost[0],cost[1])
for i in range(2,n+1):
dp[i]=min(cost[i-1]+dp[i-1],cost[i-2]+dp[i-2])
return dp[n]
if __name__=="__main__":
cost = list(map(int,input().strip().split(",")))
solution=Solution()
result=solution.minCostClimbingStairs(cost)
print(result)
注意点1:dp[0]和dp[1]注意是0
注意点2:dp的维度,注意是n+1
注意点2:最后一个台阶要再爬一个到顶楼
总结
输入输出