基础算法之——【动态规划之路径问题】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学院的本科及高职院校在校学生。 参赛要求:…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
Selenium 查找页面元素的方式
Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素,以下是主要的定位方式: 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...
