代码随想录第32天:动态规划

动态规划中每一个状态一定是由上一个状态推导出来的

动态规划的解题步骤:

1.确定dp数组的下标和具体含义

2.确定递推公式

3.递推数组dp的初始化

4.确定遍历顺序

5.举例推导递推数组

三个关键点:初始化,递推公式,遍历顺序

509. 斐波那契数

复制代码
class Solution {
public:
    int fib(int n) {
        if(n==0)
        {
            return 0;
        }
        if(n==1)
        {
            return 1;
        }
        vector<int> res(n+1);
        res[0]=0;
        res[1]=1;
        for(int i=2;i<=n;i++)
        {
            res[i]=res[i-1]+res[i-2];
        }
        return res[n];
    }
};

70. 爬楼梯

复制代码
class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp(n+1);
        if(n<=2) return n;
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;i++)
        {
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
};

明白数组下标的含义,表示几层楼梯的方法

递推公式可以倒着思考,到顶的最后方法可能走一步也可能走两步,当人还剩一层台阶时到顶的方法与dp【i-1】方法相同,还有两层时与dp【i-2】次数相同

数组初始化dp【1】=1;dp【2】=2

746. 使用最小花费爬楼梯

复制代码
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n=cost.size();
        vector<int> dp(n+1);
        dp[0]=0;
        dp[1]=0;
        for(int i=2;i<=n;i++)
        {
            dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[n];
    }
};

对于动态规划的题目可以先想一下最后一步是如何计算的然后再往前推导就可以了

相关推荐
lvxiangyu1112 小时前
MPPI 算法证明重构:基于无穷维泛函变分与 KL 散度的构造性推导
算法·重构·最优控制·随机最优控制
2301_8184190112 小时前
C++中的解释器模式变体
开发语言·c++·算法
ab15151712 小时前
3.25完成*23、*24、*28、*30、*33、*38、*39、*40
算法
颜酱12 小时前
回溯算法实战练习(3)
javascript·后端·算法
小王不爱笑13213 小时前
G1 GC 的核心基础:Region 模型的补充细节
java·jvm·算法
小王不爱笑13214 小时前
三色标记算法
算法
小O的算法实验室14 小时前
2026年AST SCI1区TOP,基于速度障碍法的多无人机三维避障策略,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
U-52184F6915 小时前
深入理解“隐式共享”与“写时复制”:从性能魔法到内存深坑
java·数据库·算法
pp起床15 小时前
Part02:基本概念以及基本要素
大数据·人工智能·算法
lzh2004091915 小时前
红黑树详解
算法