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

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

相关推荐
不想看见4041 小时前
Word Search -- 回溯法--力扣101算法题解笔记
笔记·算法·leetcode
2501_901147831 小时前
硬币找零问题的动态规划解法与实现思考笔记
笔记·算法·动态规划
Renhao-Wan1 小时前
Java 算法实践(三):双指针与滑动窗口
java·数据结构·算法
Pluchon1 小时前
硅基计划4.0 算法 图的存储&图的深度广度搜索&最小生成树&单源多源最短路径
java·算法·贪心算法·深度优先·动态规划·广度优先·图搜索算法
今儿敲了吗2 小时前
19| 海底高铁
c++·笔记·学习·算法
冰暮流星2 小时前
javascript之字符串索引数组
开发语言·前端·javascript·算法
Hag_202 小时前
LeetCode Hot100 3.无重复字符的最长子串
算法·leetcode·职场和发展
好学且牛逼的马2 小时前
【Hot100|23-LeetCode 234. 回文链表 - 完整解法详解】
算法·leetcode·链表
小冻梨6662 小时前
ABC444 C - Atcoder Riko题解
c++·算法·双指针