代码随想录笔记--动态规划篇

news2024/12/30 1:40:50

1--动态规划理论基础

动态规划经典问题:① 背包问题;② 打家劫舍;③ 股票问题; ④ 子序列问题;

动态规划五部曲:

        ① 确定 dp 数组及其下标的含义;

        ② 确定递推公式;

        ③ 确定 dp 数组的初始化;

        ④ 确定遍历顺序,一般为从左到右;

        ⑤ 打印 dp 数组,一般用于检查;

2--斐波那契数

主要思路:

        经典动态规划,dp[i] 表示第 i 个数的斐波那契数;递推公式为:dp[i] = dp[i-1] + dp[i - 2];初始化dp[0] = 1,dp[1] = 1;遍历顺序从左到右;

#include <iostream>
#include <vector>

class Solution {
public:
    int fib(int n) {
        if(n <= 1) return n;
        std::vector<int> dp(n+1, 0);
        dp[0] = 0; dp[1] = 1;
        for(int i = 2; i <= n; i++){
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

int main(int argc, char argv[]){
    int test = 2;
    Solution S1;
    int res = S1.fib(test);
    std::cout << res << std::endl;
    return 0;
}

3--爬楼梯

主要思路:

        经典动态规划,dp[i] 表示到达第 i 阶楼梯的方法数;递推公式为 dp[i] = dp[i - 1] + dp[i - 2];初始化dp[1] = 1, dp[2] = 2;遍历顺序从左到右;

#include <iostream>
#include <vector>

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

int main(int argc, char argv[]){
    int n = 2;
    Solution S1;
    int res = S1.climbStairs(n); 
    std::cout << res << std::endl;
    return 0;
}

4--使用最小花费爬楼梯

主要思路:

        dp[i] 表示到达第 i 阶楼梯需要的最小花费;初始化 dp[0] = 0, dp[1] = 0,因为可以从 0 和 1 出发,因此不需要花费;递推公式为 dp[i] = std::min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);默认从左到右遍历;

#include <iostream>
#include <vector>

class Solution {
public:
    int minCostClimbingStairs(std::vector<int>& cost) {
        std::vector<int> dp(cost.size()+1, 0); // 到达第i阶的最小花费
        dp[0] = 0;
        dp[1] = 0;
        for(int i = 2; i <= cost.size(); i++){
            dp[i] = std::min(cost[i-2]+dp[i-2], cost[i-1]+dp[i-1]);
        }
        return dp[cost.size()];
    }
};

int main(int argc, char argv[]){
    // cost = [1,100,1,1,1,100,1,1,100,1]
    std::vector<int> cost = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
    Solution S1;
    int res = S1.minCostClimbingStairs(cost);
    std::cout << res << std::endl;
    return 0;
}

5--不同路径

主要思路:

        dp[i][j] 表示到达 (i, j) 位置的路径数,初始化两个边界 dp[i][0] = 1,dp[0][j] = 1;状态转移方程为:dp[i][j] = dp[i-1][j] + dp[i][j-1];遍历顺序为从上到下,从左到右;

#include <iostream>
#include <vector>

class Solution {
public:
    int uniquePaths(int m, int n) {
        std::vector<std::vector<int>> dp(m, std::vector<int>(n, 0));
        // 初始化
        for(int i = 0; i < m; i++) dp[i][0] = 1;
        for(int j = 0; j < n; j++) dp[0][j] = 1;
        // 遍历
        for(int r = 1; r < m; r++){
            for(int c = 1; c < n; c++){
                dp[r][c] = dp[r-1][c] + dp[r][c-1];
            }
        }
        return dp[m-1][n-1];
    }
};

int main(int argc, char argv[]){
    // m = 3, n = 7
    int m = 3, n = 7;
    Solution S1;
    int res = S1.uniquePaths(m, n);
    std::cout << res << std::endl;
    return 0;
}

6--不同路径II

主要思路:

        与上题类似,dp[i][j] 表示到达 (i, j) 位置的路径数,初始化两个边界 dp[i][0] = 1,dp[0][j] = 1(确保边界没有障碍物,有障碍物初始化为0);状态转移方程为:(i, j)不是障碍物则 dp[i][j] = dp[i-1][j] + dp[i][j-1],(i, j)为障碍物则dp[i][j] = 0;遍历顺序为从上到下,从左到右;

#include <iostream>
#include <vector>

class Solution {
public:
    int uniquePathsWithObstacles(std::vector<std::vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size(), n = obstacleGrid[0].size();
        if(obstacleGrid[m-1][n-1] == 1) return 0;
        
        std::vector<std::vector<int>> dp(m, std::vector<int>(n, 0));
        // 初始化
        for(int i = 0; i < m && obstacleGrid[i][0] != 1; i++) dp[i][0] = 1;
        for(int j = 0; j < n && obstacleGrid[0][j] != 1; j++) dp[0][j] = 1;
        // 遍历
        for(int r = 1; r < m; r++){
            for(int c = 1; c < n; c++){
                if(obstacleGrid[r][c] == 1) dp[r][c] = 0; // 障碍
                else dp[r][c] = dp[r-1][c] + dp[r][c-1];
            }
        }
        return dp[m-1][n-1];
    }
};

int main(int argc, char argv[]){
    // obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
    std::vector<std::vector<int>> test = {{0, 0, 0}, {0, 1, 0}, {0, 0, 0}};
    Solution S1;
    int res = S1.uniquePathsWithObstacles(test);
    std::cout << res << std::endl;
    return 0;
}

7--整数拆分

主要思路:

        dp[i] 表示整数 i 拆分后的最大乘积;初始化dp[0] = 0, dp[1] = 0, dp[2] = 1; 状态转移方程为:dp[i] = max(dp[i], max(j*(i-j), j * dp[i-j]));

#include <iostream>
#include <vector>

class Solution {
public:
    int integerBreak(int n) {
        std::vector<int> dp(n+1, 0);
        // 初始化
        dp[0] = 0, dp[1] = 0, dp[2] = 1;
        // 遍历
        for(int i = 3; i <= n; i++){
            for(int j = 0; j <= i/2; j++){
                dp[i] = std::max(dp[i], std::max(j*(i-j), j * dp[i-j]));
            }
        }
        return dp[n];
    }
};

int main(int argc, char argv[]){
    // n = 10
    int test = 10;
    Solution S1;
    int res = S1.integerBreak(test);
    std::cout << res << std::endl;
    return 0;
}

8--不同的二叉搜索树

主要思路:

        dp[i] 表示由 i 个数字构成的不同二叉搜索树的数目;

        初始化:dp[0] = 1;

        状态转移方程:dp[i] += dp[j-1] * dp[i-j],0 <= j <= i;其中 dp[j-1] 来构成 j 的左子树,dp[i-j] 来构成 j 的右子树;

         遍历顺序:两个 for 循环,第 1 个 for 循环遍历 1 - n,第二个 for 循环遍历 1 - i;

#include <iostream>
#include <vector>

class Solution {
public:
    int numTrees(int n) {
		std::vector<int> dp(n+1, 0);
		// 初始化
		dp[0] = 1;
		// 遍历
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= i; j++){
				dp[i] += dp[j-1] * dp[i-j];
			}
		}
		return dp[n];
    }
};

int main(int argc, char *argv[]) {
	// n = 3
	int test = 3;
	Solution S1;
	int res = S1.numTrees(test);
	std::cout << res << std::endl;
	return 0;
}

9--

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker下redis备份文件dump.rdb获取

1.查看镜像 docker ps -a 2.进入redis客户端 docker exec -it redis redis-cli 3.保存备份文件 save 4.查看文件存放位置 CONFIG GET dir 5.将docker中文件拷出 docker cp id或name:容器中文件的路径 目标目录地址

学生党台灯哪款好一点?适合学生党使用的台灯推荐

不知道大家有没有仔细观察过身边的小学生以及中学生&#xff0c;很多孩子都戴上了眼镜。其实造成孩子近视的原因有很多&#xff0c;大部分家长认为主要原因还是在使用电子产品上&#xff0c;其实不止如此&#xff0c;经常使用电子产品&#xff0c;确实容易造成近视&#xff0c;…

内核和用户空间中的TID,GID, PID,uid

要获取关于eBPF中的进程信息&#xff0c;可以使用以下函数: bpf_get_current_pid_tgid()、 bpf_get_current_uid_gid()、 bpf_get_current_comm(char *buf, int size_of_buf)。 当程序被绑定到对某个内核函数调用时&#xff0c;就可以使用它们。UID/GID应该比较明确&#xff0c…

sudo文件的配置以及gccg++工具的使用

目录 sudo无法运行的原因 sudoers文件的配置 1.切换到root账户 2.打开sudoers文件 ​编辑 3.开始文件配置 gcc&g工具的使用 预处理 为什么要有条件编译呢&#xff1f; gcc预处理文件 编译 汇编 链接 动态库和静态库 sudo无法运行的原因 之前我们说过&#xff0c;普通用户在…

[Linux入门]---进程的概念

文章目录 1.进程的概念①描述进程-PCB②task_struct-PCB的一种③task_ struct内容分类 2.查看进程3.通过系统调用获取进程表示符4.通过系统调用创建进程---fork初识 1.进程的概念 在我们的电脑开机的时候&#xff0c;操作系统会被加载到内存中&#xff0c;点击多个应用进行时&a…

【校招VIP】前端js语言考点之ES6

考点介绍&#xff1a; es6就是es5的升级版&#xff0c;es5是js的通用标准&#xff0c;绝大多数浏览器都支持其语法&#xff0c;但是es6则不同&#xff0c;如果es6的代码需要在浏览器上运行&#xff0c;那就先将es6转换为es5。如果在es6中使用模块化机制&#xff0c;需要将个模块…

OAuth2.0客户端基于oltu搭建

之前提到了cas-server这个项目其本身是支持OAuth2.0协议的,因此我们可以简单搭建一个OAuth客户端,本次使用到的是Apache的oltu oltu介绍 Apache Oltu 是一个开源的 OAuth 库&#xff0c;用于帮助开发者实现 OAuth 1.0 和 OAuth 2.0 协议。OAuth 是一种用于授权和认证的协议&a…

Learn Prompt- Midjourney 图片生成:Image Prompts

Prompt 自动生成 前不久&#xff0c;Midjourney 宣布支持图片转 prompt 功能。 原始图片​ blueprint holographic design of futuristic Midlibrary --v 5Prompt 生成​ 直接输入 /describe 指令通过弹出窗口上传图像并发送&#xff0c;Midjourney 会根据该图像生成四种可…

图片无损放大在线工具分享

在论文写作过程中 忘了将图片保存330dpi怎么办&#xff1f;截图的图片放论文&#xff0c;十分模糊怎么办&#xff1f; 图片模糊、不清晰转高清的神器 【传送门】 推荐理由:无广告、速度快、在线版&#xff0c;随时用。

数据结构之【泛型】

泛型&#xff1a;定义阶段不明确具体类型&#xff0c;产生对象时明确具体类型。 //Object是Java中的最高参数统一化&#xff0c;能够接受所有的引用类型&#xff1b; //有了包装类的自动拆装箱之后&#xff0c;Object还能够接收基本类型数值&#xff08;自动装箱&#xff09; …

前端JavaScript中的 == 和 ===区别,以及他们的应用场景,快来看看吧,积累一点知识。

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、等于操作符 二、全等操作符 三、区别 小结 一、等于操作符 等于操作符用两个等于号&#xff08; &am…

基于微信小程序的校园餐饮配送系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言学生微信小程序端的主要功能有&#xff1a;配送员微信小程序端的主要功能有&#xff1a;商家微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&am…

单调栈和单调队列可以很简单

大家好&#xff0c;我是 方圆。我觉得单调栈和单调队列的题目很有特点&#xff0c;而且理解了它的特点能够很轻松容易地解决一系列题目&#xff0c;所以决定用这篇帖子记录一下&#xff0c;也想以此来帮助在刷同样类型题目的朋友们。如果大家想要找刷题路线的话&#xff0c;可以…

每日一题~组合总数III

原题链接&#xff1a;216. 组合总和 III - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路分析&#xff1a; 这是一个组合的问题&#xff0c;所以我们可以使用深度优先搜索&#xff08;DFS&#xff09;的方式将所有的情况都列举出来&#xff0c;然后将其中…

企业怎么申请OV SSL证书?

随着互联网的发展&#xff0c;越来越多的企业开始使用SSL证书来保护网站的安全。而OV SSL证书作为机构验证型的证书&#xff0c;能够重点强调网站安全、企业可信形象的网站&#xff0c;保密传输更加安全。那么&#xff0c;企业怎么申请OV SSL证书呢&#xff1f;接下来&#xff…

计算机视觉与深度学习-经典网络解析-GoogLeNet-[北邮鲁鹏]

这里写目录标题 GoogLeNet参考GoogLeNet模型结构创新点Inception结构&#xff0c;它能保留输入信号中的更多特征信息去掉了AlexNet的前两个全连接层&#xff0c;并采用了平均池化引入了辅助分类器 GoogLeNet GoogLeNet的设计主要特点是引入了Inception模块&#xff0c;这是一种…

聚观早报 | 杭州亚运开幕科技感拉满;腾讯官宣启动「青云计划」

【聚观365】9月25日消息 杭州亚运开幕科技感拉满 腾讯官宣启动「青云计划」 FF任命新全球CEO 比亚迪夺得多国销冠 iPhone 15/15 Pro销售低于预期 杭州亚运开幕科技感拉满 杭州第19届亚洲运动会开幕式23日晚在杭州奥体中心主体育馆举行&#xff0c;这届开幕式可谓科技感拉…

【linux进程(一)】深入理解进程概念--什么是进程?PCB的底层是什么?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux进程 1. 前言2. PCB初认…

Java基本数据类型只有八种?第九种告诉你

一、前言 今天看了一下Oracle官网的JVM规范&#xff0c;发现基本数据不止有八种。 这个东西一直都是说着八种&#xff0c;官网把returnAddress放在八种基本数据类型一起说的&#xff0c;我们可以理解为第九种&#xff01; 常说的八种用于存储常见的数值和字符数据&#xff0…

计算机等级考试—信息安全三级真题六

目录 一、单选题 二、填空题 三、综合题 一、单选题