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

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

相关推荐
老纪的技术唠嗑局6 分钟前
深度解析 LLM Wiki / Obsidian-Wiki / GBrain:Agent 时代知识的“自组织”与“自进化”
大数据·数据库·人工智能·算法
YXXY3133 小时前
模拟算法的介绍
算法
happymaker06263 小时前
简单LRU的实现(基于LinkedHashMap)
算法·leetcode·lru
会编程的土豆4 小时前
【数据结构与算法】空间复杂度从入门到面试:不仅会算,还要会解释
数据结构·c++·算法·面试·职场和发展
普通网友4 小时前
《算法面试必刷:15 个高频 LeetCode 题(附代码)》
算法·leetcode·面试
_深海凉_4 小时前
LeetCode热题100-搜索二维矩阵
算法·leetcode·矩阵
张槊哲4 小时前
C++ 进阶指南:如何丝滑地理解与实践多线程与多进程
开发语言·c++·算法
Hello eveybody4 小时前
介绍一下背包DP(C++)
开发语言·c++·动态规划·dp·背包dp
代码中介商4 小时前
C语言链表完全指南:从单节点到链表管理
c语言·算法·链表
小小de风呀5 小时前
de风——【从零开始学C++】(四):类和对象(下)
开发语言·c++·算法