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

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 = 7int 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 = 10int 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 = 3int test = 3;Solution S1;int res = S1.numTrees(test);std::cout << res << std::endl;return 0;
}

9--

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

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

相关文章

第二章 使用matplotlib绘制简单图表

第二章 使用matplotlib绘制简单图表 1.绘制折线图 1.1.使用plot()绘制折线图 ​ 使用pyplot的plot()函数可以快速绘制折线图。plot()函数的语法格式如下&#xff1a; plot&#xff08;x, y, fmt, scalexTrue, scaleyTrue, dataNone, labelNone, *args, **kwargs&#xff09…

工业互联网:数字化革命的引擎

工业互联网&#xff0c;作为数字化革命的引擎&#xff0c;正以前所未有的速度和力度改变着我们的世界。这一概念不再局限于企业内部的信息技术应用&#xff0c;而是将互联网、大数据、人工智能等技术深度融入到制造业、能源、交通、农业等各个领域&#xff0c;实现了设备、系统…

【深度学习】ONNX模型多线程快速部署【基础】

【深度学习】ONNX模型CPU多线程快速部署【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】ONNX模型CPU多线程快速部署【基础】前言搭建打包环境python多线程并发简单教程基本教程ONNX模型多线程并发 打包成可执行文件总结 前…

rar格式转换zip格式,如何做?

平时大家压缩文件时对压缩包格式可能没有什么要求&#xff0c;但是&#xff0c;可能因为工作需要&#xff0c;我们要将压缩包格式进行转换&#xff0c;那么我们如何将rar格式转换为其他格式呢&#xff1f;方法如下&#xff1a; 工具&#xff1a;WinRAR 打开WinRAR&#xff0c…

友思特案例|友思特 Ensenso 3D相机:汽车工业自动化的革命性力量

01 内容摘要 在竞争激烈的汽车行业&#xff0c;自动化生产至关重要。友思特 Ensenso 3D相机为汽车制造商提供了可靠的工具和技术支持&#xff0c;助力多个关键环节。它在汽车座位泡棉切割中提高精确度&#xff0c;降低浪费&#xff0c;提高生产效率&#xff1b;在汽车压铸零部…

ad18学习笔记十二:如何把同属性的元器件全部高亮?

1、先选择需要修改的器件的其中一个。 2、右键find similar objects&#xff0c;然后在弹出的对话框中&#xff0c;将要修改的属性后的any改为same 3、像这样勾选的话&#xff0c;能把同属性的元器件选中&#xff0c;其他器件颜色不变 注意了&#xff0c;如果这个时候&#xff…

浅谈xss

XSS 简介 XSS,全称Cross Site Scripting,即跨站脚本攻击,是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。需要强调的是,XSS不仅…

Win10专业版系统一键重装怎么操作?

Win10专业版系统一键重装怎么操作&#xff1f;与传统的系统重装相比&#xff0c;一键重装不仅省去了繁琐的安装步骤&#xff0c;这一简单操作使得系统维护和恢复变得更加便捷&#xff0c;让用户不再为系统问题而烦恼。下面小编给大家详细介绍关于一键重装Win10专业版系统的操作…

Tune-A-Video论文阅读

论文链接&#xff1a;Tune-A-Video: One-Shot Tuning of Image Diffusion Models for Text-to-Video Generation 文章目录 摘要引言相关工作文生图扩散模型文本到视频生成模型文本驱动的视频编辑从单个视频生成 方法前提DDPMsLDMs 网络膨胀微调和推理模型微调基于DDIM inversio…

ElasticSearch从入门到精通(二)

ElasticSearch 高级操作 bulk批量操作 批量操作-脚本 #批量操作 #1.删除5号 #新增8号 #更新2号 name为2号 POST _bulk {"delete":{"_index":"person1","_id":"5"}} {"create":{"_index":"person…

Android 10.0 系统开启和关闭黑白模式主题功能实现

1. 概述 在10.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

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:容器中文件的路径 目标目录地址

研究铜互连的规模能扩大到什么程度

随着领先的芯片制造商继续将finFET以及很快的纳米片晶体管缩小到越来越小的间距&#xff0c;使用铜及其衬垫和阻挡金属&#xff0c;较小的金属线将变得难以维持。接下来会发生什么以及何时发生&#xff0c;仍有待确定。 自从IBM在20世纪90年代向业界引入采用双镶嵌工艺的铜互连…

一文教你彻底理解什么是协程!

作为程序员&#xff0c;想必你多多少少听过协程这个词&#xff0c;这项技术近年来越来越多的出现在程序员的视野当中&#xff0c;尤其高性能高并发领域。当你的同学、同事提到协程时如果你的大脑一片空白&#xff0c;对其毫无概念。。。 那么这篇文章正是为你量身打造的。话不…

flink集群与资源@k8s源码分析-回顾

本章是分析系列最后一章,作为回顾,以运行架构图串联起所有分析场景 1 启动集群,部署集群(提交k8s),新建作业管理器组件 2 构建和启动flink master组件 3 提交作业,N/A

性能测试分析调优必备的java虚拟机知识

Java虚拟机 Java虚拟机&#xff08;Java Virtual Machine&#xff0c;简称JVM&#xff09;是一种用于执行Java字节码的虚拟计算机。它是Java平台的关键组成部分&#xff0c;负责将Java源代码编译为可在不同计算机体系结构上执行的字节码。 JVM起到了中间层的作用&#xff0c…

IP转地理位置:探讨技术与应用

IP地址是互联网上设备的唯一标识符&#xff0c;而将IP地址转换为地理位置信息是网络管理、安全监控和市场定位等领域中的一项重要任务。本文将深入探讨IP转地理位置的技术原理和各种应用场景。 IP地址与地理位置 IP地址&#xff08;Internet Protocol Address&#xff09;是一…

面试官:你了解axios的原理吗?有看过它的源码吗?

面试官&#xff1a;你了解axios的原理吗&#xff1f;有看过它的源码吗&#xff1f; 一、axios的基本使用 关于 axios 的基本使用&#xff0c;上篇文章已经有所涉及&#xff0c;这里再稍微回顾一下&#xff1a; 发送请求 import axios from axios;axios(config) // 直接传入…

一百八十六、大数据离线数仓完整流程——步骤五、在Hive的DWS层建动态分区表并动态加载数据

一、目的 经过6个月的奋斗&#xff0c;项目的离线数仓部分终于可以上线了&#xff0c;因此整理一下离线数仓的整个流程&#xff0c;既是大家提供一个案例经验&#xff0c;也是对自己近半年的工作进行一个总结。 二、数仓实施步骤 &#xff08;五&#xff09;步骤五、在Hive的…

《从菜鸟到大师之路 MySQL 篇》

《从菜鸟到大师之路 MySQL 篇》 数据库是什么 数据库管理系统&#xff0c;简称为DBMS&#xff08;Database Management System&#xff09;&#xff0c;是用来存储数据的管理系统。 DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 实现读取自动化需要编程…