代码随想录算法训练营第35天 | 动态规划1:509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

代码随想录算法训练营第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#算法公开课

理论基础

常见题目

  1. 动规基础
  2. 背包问题
  3. 打家劫舍
  4. 股票问题
  5. 子序列问题

思考路线

  1. dp数组含义、下标含义;
  2. 递推公式;
  3. dp数组如何初始化;
  4. 遍历顺序;
  5. 打印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]
posted @ 2024-07-21 15:06  哆啦**  阅读(1)  评论(0编辑  收藏  举报