代码随想录算法训练营第35天 |
动态规划理论基础
https://programmercarl.com/动态规划理论基础.html#算法公开课
509.斐波那契数
https://leetcode.cn/problems/fibonacci-number/submissions/548309803/
代码随想录
https://programmercarl.com/0509.斐波那契数.html#算法公开课
70.爬楼梯
https://leetcode.cn/problems/climbing-stairs/description/
代码随想录
https://programmercarl.com/0070.爬楼梯.html#其他语言版本
746.使用最小花费爬楼梯
https://leetcode.cn/problems/min-cost-climbing-stairs/description/
代码随想录
https://programmercarl.com/动态规划理论基础.html#算法公开课
理论基础
常见题目
- 动规基础
- 背包问题
- 打家劫舍
- 股票问题
- 子序列问题
思考路线
- dp数组含义、下标含义;
- 递推公式;
- dp数组如何初始化;
- 遍历顺序;
- 打印dp数组Debug;
509. 斐波那契数
题解思路
- dp算法的意义和初始化在题目里已经定义好了
题解代码
class Solution:
def fib(self, n: int) -> int:
if n<2:
return n
##考虑特殊情况
dp = [0]*(n+1)
dp[1] = 1
##初始化
for i in range(2, n+1):
dp[i] = dp[i-1]+dp[i-2]
##递推公式
return dp[n]
70.爬楼梯
题解思路
- dp含义:第i个数字代表第i节楼梯有dp[i]中方法到达楼顶
- 递推公式:每次可以爬1-2级台阶 即dp[i] = dp[i-1]+dp[i-2]
- 正常遍历
- 只需要两个存储空间 dp[0] dp[1] 按位循环即可
题解代码
class Solution:
def climbStairs(self, n: int) -> int:
if n<3:
return n
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]
class Solution:
def climbStairs(self, n: int) -> int:
if n<3:
return n
dp = [0]*2
dp[0] = 1
dp[1] = 2
for i in range(2,n):
data = dp[0]+dp[1]
dp[0] = dp[1]
dp[1] = data
return dp[1]
746. 使用最小花费爬楼梯
题解思路:
- dp含义:dp[i]为第i个台阶前的花销;所以最后的结果为len(cost)+1 最后一个值;
- 递推公式:dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
- 可以压缩dp的空间
题解代码
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp = [0]*(len(cost)+1) ##到该节台阶需要的花费
for i in range(2,len(cost)+1):
dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
return dp[-1]
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp = [0]*2 ##到该节台阶需要的花费
for i in range(2,len(cost)+1):
data = min(dp[1]+cost[i-1],dp[0]+cost[i-2])
dp[0] = dp[1]
dp[1] = data
return dp[-1]
标签:契数,爬楼梯,int,随想录,cost,https,dp
From: https://www.cnblogs.com/P201821440041/p/18314478