代码随想录第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];
    }
};

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

相关推荐
脱氧核糖核酸__4 小时前
LeetCode热题100——41.缺失的第一个正数(题解+答案+要点)
数据结构·c++·算法·leetcode·哈希算法
脱氧核糖核酸__4 小时前
LeetCode热题100——73.矩阵置零(题目+题解+答案)
c++·算法·leetcode·矩阵
Mr_Xuhhh4 小时前
深入理解单链表的递归反转:从原理到实现
算法·leetcode·职场和发展
智者知已应修善业4 小时前
【51单片机数码管+蜂鸣器的使用】2023-6-14
c++·经验分享·笔记·算法·51单片机
迷途之人不知返4 小时前
算法类型:双指针类型
算法
吴可可1234 小时前
三点绘圆弧的几何实现
算法
kyle~4 小时前
导航---LIO(激光雷达-惯性里程计)算法
c++·算法·机器人·ros2·导航
AGI前沿4 小时前
# 反内卷,回基础:Nano-Memory用极简检索与剪枝,解决大模型长对话遗忘
算法·机器学习
无限进步_4 小时前
【C++】私有虚函数与多态:访问权限不影响动态绑定
开发语言·c++·ide·windows·git·算法·visual studio
君鼎4 小时前
C++20 新特性全面总结
算法·c++20