代码随想录算法训练营第三十二天|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)]
相关推荐
带多刺的玫瑰1 小时前
Leecode#4刷题之寻找两个正序数组的中位数
java·前端·算法
土司大王2 小时前
LeetCode hot100——除了自身以外数组的乘积
数据结构·算法·leetcode
IvanCodes2 小时前
RAG 实战教程(三):向量数据库检索算法,KNN、IVF、HNSW 与 Faiss 实战
人工智能·算法·agent
阿无,2 小时前
布隆过滤器
java·算法·哈希算法
徒慕风流2 小时前
激光雷达回波信号滤波与时刻鉴别算法:原理、代码实现与仿真验证
python·算法·激光雷达
这料鬼有毒2 小时前
二刷hot100-70.爬楼梯
算法
CIO_Alliance3 小时前
AI算法系列(2)| 决策树与随机森林XGBoost:企业AI化转型中的树模型选型逻辑
大数据·人工智能·算法·决策树·系统集成·企业cio联盟·企业级ai化转型
.道阻且长.3 小时前
10.LeetCode算法习题讲解--滑动窗口--最大连续为一的个数
算法·leetcode·职场和发展
学习中.........4 小时前
Karpathy nanoGPT 教程到底讲了什么
人工智能·算法·语言模型
城管不管4 小时前
重生——第十次面试之开源中国一面挂
java·linux·开发语言·算法·面试·职场和发展·开源