代码随想录算法训练营第三十二天|509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

理论基础

动态规划是由上一个状态推断出来的,不像贪心只是每次取局部最优解,和前一次没关系

动态规划比较重要的是状态转移方程,解题的基本流程如下:

1.确定dp数组以及下标的含义

2.确定递推公式

3.dp数组如何初始化

4.确定遍历顺序

5.举例推到dp数组

509. 斐波那契数

最简单的方式就是递归

python 复制代码
class Solution:
    def fib(self, n: int) -> int:
        if n==0:
            return 0
        if n==1:
            return 1
        return self.fib(n-1)+self.fib(n-2)

下面使用动态规划,时间复杂度只要O(n)

python 复制代码
class Solution:
    def fib(self, n: int) -> int:
        if n<=1:
            return n
        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]

70. 爬楼梯

仔细分析一下,状态转移方程和菲波那切数列是一样的,因为假设我们有n个台阶,要么是从n-1上来,要么是从n上来,这两种状态的和就是现在的状态的值

python 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        if n<=2:
            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]
        

746. 使用最小花费爬楼梯

这个 也写出来了,但是不是那么清晰

python 复制代码
class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        if len(cost)==2:
            return min(cost[0],cost[1])
        dp = [0]*(len(cost)+1)
        dp[0] = 0
        dp[1] = 0
        dp[2]=min(cost[0],cost[1])
        for i in range(3,len(cost)+1):
            dp[i] = min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1])
        return dp[len(cost)]

一个是这个dp数组的下标表示的是cost长度为i的情况下,需要的最小花费(到达第i个台阶所需要花费的最小体力)

状态转移方程dpi=min(dpi-1+costi-1,dpi-2+costi-2)

初始化的时候dp0,dp1=0

python 复制代码
class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        dp = [0]*(len(cost)+1)
        dp[0] = 0
        dp[1] = 0
        for i in range(2,len(cost)+1):
            dp[i] = min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1])
        return dp[len(cost)]
相关推荐
GoAI3 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi4 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M6 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen7 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷9 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方9 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん10 小时前
【C++】哈希表
c++·算法·散列表
地平线开发者10 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
武子康12 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法