基础算法之——【动态规划之路径问题】1
今天更新动态规划路径问题1,后续会继续更新其他有关动态规划的问题!动态规划的路径问题,顾名思义,就是和路径相关的问题。当然,我们是从最简单的找路径开始!
- 动态规划的使用方法:
1.确定状态并定义状态数组:(i,j)代表什么意思?dp[i][j]又是什么意思?
2.确定状态转移方程,即递推公式
3.确定边界条件并初始化
4.确定遍历顺序
5.状态转移
6.输出结果
文章目录
- 一、LC 62 不同路径
- 方法一:深度优先搜索
- 方法二:动态规划(二维)
- 方法三:动态规划(一维)
- 方法四:排列组合
- 二、LC 63 不同路径II
- 方法一:动态规划(二维)
- 方法二:动态规划(一维)
- 方法三:记忆化搜索
- 三、LC 64 最小路径和
- 方法一:动态规划(二维)
- 方法二:动态规划(一维)
一、LC 62 不同路径
LC 62 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
方法一:深度优先搜索
代码如下:
class Solution {
private:int dfs(int m,int n,int i,int j){//行或列有至少一个越界if(i>m||j>n) return 0;//到达终点(在竖直方向达到m,水平方向达到n,也即坐标达到(m,n))if(i==m && j==n) return 1;//递归搜索(左子树和右子树)return dfs(m,n,i+1,j)+dfs(m,n,i,j+1);}
public:int uniquePaths(int m, int n) {//从根节点开始遍历int cnt=dfs(m,n,1,1);return cnt;}
};
方法二:动态规划(二维)
代码如下:
/*动态规划的使用方法:
1.确定状态并定义状态数组:(i,j)代表什么意思?dp[i][j]又是什么意思?
2.确定状态转移方程,即递推公式
3.确定边界条件并初始化
4.确定遍历顺序
5.状态转移
6.输出结果
*/
class Solution {public:int uniquePaths(int m, int n) {//定义一个状态数组,用来存方法数 int dp[101][101]={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 i=1;i<m;i++){for(int j=1;j<n;j++){//状态转移dp[i][j]=dp[i][j-1]+dp[i-1][j];}}//返回结果return dp[m-1][n-1];}
};
方法三:动态规划(一维)
代码如下:
class Solution {
public:int uniquePaths(int m, int n) {//定义一维状态数组 int dp[101]={0};//初始化数组值为1,即相对于二维数组第一行全是1for(int i=0;i<n;i++){dp[i]=1;}//遍历for(int i=1;i<m;i++){for(int j=1;j<n;j++){//状态转移:dp[j]指的是上一行的j,dp[j-1]指的是当前行左边的j;//每次状态转移都相当于先将上一行的运算拷贝过来,再加上从左面来的方案数dp[j]=dp[j-1]+dp[j];}}return dp[n-1];}
};
方法四:排列组合
代码如下:
class Solution {
public:int uniquePaths(int m, int n) {long long numerator = 1; // 初始化分子int denominator = m - 1; // 初始化分母int count = m - 1;//定义分子的乘积项的个数int t = m + n - 2;//定义分子的最大乘积项while (count--) {//分子累乘count项numerator *= (t--);while (denominator != 0 && numerator % denominator == 0) {//约分(也即除以公因数)numerator /= denominator;//约去一个公因数denominator--;}}return numerator;}
};
二、LC 63 不同路径II
LC 63 不同路径II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
方法一:动态规划(二维)
代码如下:
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {//求出二维动态数组的行数int m=obstacleGrid.size();//求出二维动态数组的列数int n=obstacleGrid[0].size();//定义状态数组int dp[101][101]={0};//边界判断if(obstacleGrid[0][0]==1 || obstacleGrid[m-1][n-1]==1) return 0;//初始化状态数组dp[0][0]=1;//遍历for(int i=0;i<m;i++){for(int j=0;j<n;j++){//如果是障碍物,则此路不通,路径数归零if(obstacleGrid[i][j]==1){dp[i][j]=0;continue;}//状态转移,此处和上面的一样if(i>0 && j>0) dp[i][j]=dp[i-1][j]+dp[i][j-1];else if(i>0) dp[i][j]=dp[i-1][j];else if(j>0) dp[i][j]=dp[i][j-1];//也可以这样写
/*if(obstacleGrid[i][j]==0){//状态转移,此处和上面的一样if(i>0 && j>0) dp[i][j]=dp[i-1][j]+dp[i][j-1];else if(i>0) dp[i][j]=dp[i-1][j];else if(j>0) dp[i][j]=dp[i][j-1];}}else continue;
*/}}return dp[m-1][n-1];}
};
方法二:动态规划(一维)
代码如下:
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {if (obstacleGrid[0][0] == 1)return 0;vector<int> dp(obstacleGrid[0].size(),0);//初始化一维状态数组(第一行)for (int j = 0; j < dp.size() && obstacleGrid[0][j] == 0 ; ++j)if (j == 0)dp[j] = 1;elsedp[j] = dp[j-1];//for (int i = 1; i < obstacleGrid.size(); ++i)//行for (int j = 0; j < dp.size(); ++j){//列if (obstacleGrid[i][j] == 1)dp[j] = 0;else if (j != 0)dp[j] = dp[j] + dp[j-1];}return dp.back();//返回最后一个状态对应值}
};
方法三:记忆化搜索
代码如下:
class Solution {
public:int m,n;vector<vector<int>>memo;vector<pair<int,int>>dir{{0,1},{1,0}};int uniquePathsWithObstacles(vector<vector<int>>& ob) {n=ob.size();m=ob[0].size();if(ob[0][0]==1||ob[n-1][m-1]==1){return 0;}memo.resize(n,vector<int>(m,0));return dfs(ob,0,0);}int dfs(vector<vector<int>>&ob,int i,int j){if(memo[i][j]!=0){return memo[i][j];}if(i==n-1&&j==m-1){memo[i][j]=1;return 1;}int cur=0;for(auto &d:dir){int x=i+d.first;int y=j+d.second;if(x>=0&&x<n&&y>=0&&y<m&&ob[x][y]==0){cur+=dfs(ob,x,y);}}memo[i][j]=cur;return memo[i][j];}
};作者:Gallant MurdockrFZ
链接:https://leetcode.cn/problems/unique-paths-ii/solutions/2466610/dfsji-yi-hua-sou-suo-by-gallant-murdockr-e882/
来源:力扣(LeetCode)
三、LC 64 最小路径和
LC 64 最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
方法一:动态规划(二维)
代码如下:
class Solution {
public:int minPathSum(vector<vector<int>>& grid) {//定义一个二维状态数组int dp[201][201]={0};//初始化状态数组dp[0][0]=grid[0][0];//获得行数和列数int m=grid.size();int n=grid[0].size();for(int i=0;i<m;i++){for(int j=0;j<n;j++){//正常情况if(i>0 && j>0){dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];}//边界条件else if(i>0) dp[i][j]=dp[i-1][j]+grid[i][j];else if(j>0) dp[i][j]=dp[i][j-1]+grid[i][j];}}return dp[m-1][n-1];}
};
方法二:动态规划(一维)
代码如下:
class Solution {
public:int minPathSum(vector<vector<int>>& grid) {//获取行数和列数int m=grid.size();int n=grid[0].size();//定义一维状态数组int dp[201]={0};//初始化第一行dp[0]=grid[0][0];for(int i=1;i<n;i++){dp[i]=grid[0][i]+dp[i-1];}//状态转移(配合滚动数组优化)for(int i=1;i<m;i++){for(int j=0;j<n;j++){//左边界if(j==0) dp[j]+=grid[i][j];//其他情况else dp[j]=min(dp[j-1],dp[j])+grid[i][j];}}return dp[n-1];}
};
我以前没怎么接触过动态规划,目前就是每天有空看看题,想想解题思路啥的,但愿有效果吧!
相关文章:

基础算法之——【动态规划之路径问题】1
今天更新动态规划路径问题1,后续会继续更新其他有关动态规划的问题!动态规划的路径问题,顾名思义,就是和路径相关的问题。当然,我们是从最简单的找路径开始! 动态规划的使用方法: 1.确定状态并…...

三十三、【进阶】索引的分类
1、索引的分类 (1)总分类 主键索引、唯一索引、常规索引、全文索引 (2)InnoDB存储引擎中的索引分类 2、 索引的选取规则(InnoDB存储引擎) 如果存在主键,主键索引就是聚集索引; 如果不存在主键ÿ…...

VBox启动失败、Genymotion启动失败、Vagrant迁移
VBox启动失败、Genymotion启动失败、Vagrant迁移 2023.10.9 最新版本vbox7.0.10、Genymotion3.5.0 Vbox启动失败 1、查看日志 Error -610 in supR3HardenedMainInitRuntime! (enmWhat4) Failed to locate ‘vcruntime140.dll’ 日志信息查看方法->找到虚拟机所在位置->…...

一篇短小精悍的文章让你彻底明白KMP算法中next数组的原理
以后保持每日一更,由于兴趣较多,更新内容不限于数据结构,计算机组成原理,数论,拓扑学......,所谓:深度围绕职业发展,广度围绕兴趣爱好。往下看今日内容 一.什么是KMP算法 KMP&#x…...

CSS盒子定位的扩张
定位的扩展 绝对定位(固定定位)会完全压住盒子 浮动元素不会压住下面标准流的文字,而绝对定位或固定位会压住下面标准流的所有内容 如果一个盒子既有向左又有向右,则执行左,同理执行上 显示隐藏 display: none&…...

SpringBoot整合POI实现Excel文件读写操作
1.环境准备 1、导入sql脚本: create database if not exists springboot default charset utf8mb4;use springboot;create table if not exists user (id bigint(20) primary key auto_increment comment 主键id,username varchar(255) not null comment 用…...

从零开始的力扣刷题记录-第八十七天
力扣每日四题 129. 求根节点到叶节点数字之和-中等130. 被围绕的区域-中等437. 路径总和 III-中等376. 摆动序列-中等总结 129. 求根节点到叶节点数字之和-中等 题目描述: 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 …...

【1】c++设计模式——>UML类图的画法
UML介绍 UML:unified modeling language 统一建模语言 面向对象设计主要就是使用UML类图,类图用于描述系统中所包含的类以及他们之间的相互关系,帮助人们简化对系统的理解,他是系统分析和设计阶段的重要产物,也是系统编码和测试的…...

SAP UI5 指定 / 变更版本
SAP UI5 指定 / 变更版本 Currently, SAP Fiori tools support SAP Fiori elements and SAPUI5 freestyle projects with minimum SAPUI5 versions 1.65 or higher. In case there’s a need to test an existing projects with a lower SAPUI5 version, the following worka…...

SpringMVC中异常处理详解
单个控制器异常处理 // 添加ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})public String exceptionHandle1(Exception ex, Model mo…...

PPT课件培训视频生成系统实现全自动化
前言 困扰全动自化的重要环节,AI语音合成功能,终于可以实现自动化流程,在此要感谢团队不懈的努力和韧性的精神! 实现原理 请参照我的文章《Craneoffice云PPT课件培训视频生成系统》 基本流程 演示视频 PPT全自动 总结 过去实…...

基于腾讯云的OTA远程升级
一、OTA OTA即over the air,是一种远程固件升级技术,它允许在设备已经部署在现场运行时通过网络远程更新其固件或软件。OTA技术有许多优点,比如我们手机系统有个地方做了优化,使用OTA技术我们就不用召回每部手机,直接通过云端就可…...

如何在VS2022中进行调试bug,调试的快捷键,debug与release之间有什么区别
什么是bug 在学习编程的过程中,应该都听说过bug吧,那么bug这个词究竟是怎么来的呢? 其实Bug的本意是“虫子”或者“昆虫”,在1947年9月9日,格蕾丝赫柏,一位为美国海军工作的电脑专家,也是最早…...

初识jmeter及简单使用
目录 1、打开页面: 2、添加线程组: 3、线程组中设置参数: 4、添加请求 5、添加一个http请求后,设置请求内容 6、添加察看结果树 7、执行,查看结果 一般步骤是:在测试计划下面新建一个线程组…...

Spring 在多线程环境下如何确保事务一致性
问题在现 如何解决异步执行 多线程环境下如何确保事务一致性 事务王国回顾 事务实现方式回顾 编程式事务 利用编程式事务解决问题 问题分析完了,那么如何解决问题呢? 小结 问题在现 我先把问题抛出来,大家就明白本文目的在于解决什…...

[Machine Learning] Learning with Noisy Data
文章目录 Probabilistic Perspective of NoiseBias and VarianceRobustness among Surrogate Loss FunctionsNMF Probabilistic Perspective of Noise 假设数据来源于一个确定的函数,叠加了高斯噪声。我们有: y h ( x ) ϵ y h(x) \epsilon yh(x)ϵ…...

C++中有哪些常用的标准库?
C中有许多常用的标准库,这些库提供了丰富的功能和工具,方便开发人员进行各种任务。以下是一些常见的C标准库: iostream:用于输入和输出操作,包括cin、cout和cerr等类和函数。algorithm:提供了许多常用的算…...

软考-信息安全工程师概述
本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 2023年10月 信息考试大纲 通过本考试的合格人员能够掌握网络信息安全的基础知识和技术原理,…...

2023-2024年华为ICT网络赛道模拟题库
2023-2024年网络赛道模拟题库上线啦,全面覆盖网络,安全,vlan考点,都是带有解析 参赛对象及要求: 参赛对象:现有华为ICT学院及未来有意愿成为华为ICT学院的本科及高职院校在校学生。 参赛要求:…...

英特尔参与 CentOS Stream 项目
导读红帽官方发布公告欢迎英特尔参与进 CentOS Stream 项目,并表示 “这一举措不仅进一步深化了我们长期的合作关系,也构建在英特尔已经在 Fedora 项目中积极贡献的基础之上。” 目前,CentOS Stream 共包括以下特别兴趣小组(SIG&a…...

Centos 服务器 MySQL 8.0 快速开启远程访问
环境: MySQL 8.0(低版本会有些不同), Rocky Linux 9.0(CentOS) 直接上干货,相信大家看到这个文章的时候都已经安装完了。 1. 先从服务器上使用 root 进行登录(刚安装完默认只能本地…...

充电保护芯片TP4054国产替代完全兼容DP4054DP4054H 锂电充电芯片
■产品概述 DP4054H是-款完整的采用恒定电流/恒定电压单节锂离子电池充电管理芯片。其SOT小封装和较少的外部元件数目使其成为便携式应用的理想器件,DP4054H可 以适合USB电源和适配器电源工作。 由于采用了内部PMOSFET架构,加上防倒充电路,所以不需要外…...

Java Spring Boot中的爬虫防护机制
随着互联网的发展,爬虫技术也日益成熟和普及。然而,对于某些网站来说,爬虫可能会成为一个问题,导致资源浪费和安全隐患。本文将介绍如何使用Java Spring Boot框架来防止爬虫的入侵,并提供一些常用的防护机制。 引言&a…...

状态模式 行为型模式之六
1.定义 允许一个对象在其对象内部状态改变时改变它的行为。 2.组成结构 Context:定义客户感兴趣的接口;维护一个ConcreteState子类的实例,这个实例定义当前的状态。State:定义一个接口来封装Context的与特定状态相关的行为。Co…...

JAVA NIO深入剖析
4.1 Java NIO 基本介绍 Java NIO(New IO)也有人称之为 java non-blocking IO是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方…...

企业电子招投标系统源码之电子招投标系统建设的重点和未来趋势
功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所…...

基于正点原子alpha开发板的第三篇系统移植
系统移植的三大步骤如下: 系统uboot移植系统linux移植系统rootfs制作 一言难尽,踩了不少坑,当时只是想学习驱动开发,发现必须要将第三篇系统移植弄好才可以学习后面驱动,现将移植好的文件分享出来: 仓库&…...

数据结构与算法设计分析——贪心算法的应用
目录 一、贪心算法的定义二、贪心算法的基本步骤三、贪心算法的性质(一)最优子结构性质(二)贪心选择性质 四、贪心算法的应用(一)哈夫曼树——哈夫曼编码(二)图的应用——求最小生成…...

Leetcode 2895. Minimum Processing Time
Leetcode 2895. Minimum Processing Time 1. 解题思路2. 代码实现 题目链接:2895. Minimum Processing Time 1. 解题思路 这一题整体上来说其实没啥难度,就是一个greedy算法,只需要想明白耗时长的任务一定要优先执行,不存在某个…...