基础算法之——【动态规划之路径问题】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];}
};

我以前没怎么接触过动态规划,目前就是每天有空看看题,想想解题思路啥的,但愿有效果吧!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冲刺第十五届蓝桥杯P0003倍数问题

文章目录 原题连接解析代码 原题连接 倍数问题 解析 需要找出三个数字&#xff0c;三个数字之和是k的倍数&#xff0c;并且这个数字需要最大&#xff0c;很容易想到的就是将数组进行倒叙排序&#xff0c;然后三层for循环解决问题&#xff0c;但是这样会导致**时间复杂度很高…

机器学习基础-数据分析:房价预测

mac设置中文字体 #要设置下面两行才能显示中文 Arial Unicode MS 为字体 plt.rcParams[font.sans-serif] [Arial Unicode MS] #设置图片大小 plt.figure(figsize(20, 11), dpi200)pie官方文档 总体代码 python import pandas as pd import numpy as np import matplotlib.…

194、SpringBoot --- 下载和安装 Erlang 、 RabbitMQ

本节要点&#xff1a; 一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗&#xff1a; rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问 htt…

九大装修收纳空间的设计,收藏备用!福州中宅装饰,福州装修

如果房子面积不大&#xff0c;收纳设计就显得非常重要。其实装修房子中很多地方都可以做收纳&#xff0c;九大空间每一处都可以放下你的东西&#xff0c;让你摆脱收纳烦恼。 收纳空间少的话&#xff0c;装修完后住久了怕会乱成一窝&#xff0c;因此装修的时候&#xff0c;收纳…

react create-react-app v5配置 px2rem (不暴露 eject方式)

环境信息&#xff1a; create-react-app v5 “react”: “^18.2.0” “postcss-plugin-px2rem”: “^0.8.1” 配置步骤&#xff1a; 不暴露 eject 配置自己的webpack&#xff1a; 1.下载react-app-rewired 和 customize-cra-5 npm install react-app-rewired customize-cra…

对图像中边、线、点的检测(支持平面/鱼眼/球面相机)附源码

前言 图像的线段检测是计算机视觉和遥感技术中的一个基本问题,可广泛应用于三维重建和 SLAM 。虽然许多先进方法在线段检测方面表现出了良好的性能,但对未去畸变原始图像的线 段检测仍然是一个具有挑战性的问题。此外,对于畸变和无畸变的图像都缺乏统一的…

SuperMap iServer 影像服务自动守护能力

作者&#xff1a;Carlo 目录 一、监控目录能力1、影像服务创建后&#xff0c;在添加影像集合时配置自动追加2、配置集合基本信息3、开启自动追加4、效果展示 二、静默切片支持计划任务1、配置影像集合静默切片任务2、配置瓦片方案3、配置静默切片计划任务4、效果展示 背景&…

微信小程序开发缺少中间证书问题(腾讯云、阿里云等做服务器)

项目使用nginx做负载均衡后&#xff0c;不再采用原来直接用jar包的方式直接开启对应端口&#xff0c;所以需要重新从云服务器上下载证书&#xff0c;写入到Nginx读取的证书路径上即可。

戏剧影视设计制作虚拟仿真培训课件提升学生的参与感

说起影视制作&#xff0c;知名的影视制片人寥寥无几&#xff0c;大多数人还在依靠摄影机拍摄实景或搭建实体场景来不断精进场景布局和导演效果&#xff0c;成本高、投入人员多且周期长&#xff0c;随着VR虚拟现实技术的不断发展&#xff0c;利用VR模拟仿真技术进行影视制作实操…

Arcgis快速计算NDVI

Arcgis快速计算NDVI 一、问题描述 如何使用Arcgis像ENVI一样波段计算NDVI的值&#xff0c;事实上&#xff0c;Arcgis更快速一些。 二、操作步骤 首先准备好影像 打开窗口-影像分析 点击左上角 点击确定 &#xff08;发现自己使用的遥感影像不对劲&#xff0c;是计算好了…

JSP旅游平台管理

本系统采用基于JAVA语言实现、架构模式选择B/S架构&#xff0c;Tomcat7.0及以上作为运行服务器支持&#xff0c;基于JAVA、JSP等主要技术和框架设计&#xff0c;idea作为开发环境&#xff0c;数据库采用MYSQL5.7以上。 开发环境&#xff1a; JDK版本&#xff1a;JDK1.8 服务器&…

主从复制的实现方案

读写分离技术架构图 实现读写分离的技术架构选型如上;需要自己去实践主从复制;为了节省资源&#xff0c;当然系统并发量并没有那么大,选择一主一丛;强制读主库,为了解决主从同步延迟带来的影响&#xff1b;对于实时性要求高的强制读主库&#xff1b;GTID 主要是一种事务标识技术…

ToBeWritten之车联网安全中常见的TOP 10漏洞

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

微信公众号运营一般怎么收费?建议收藏

在互联网时代&#xff0c;公众号运营已经成为企业、政府和个人进行品牌宣传、产品推广、客户服务的重要手段。通过公众号&#xff0c;企业可以与用户建立直接的联系&#xff0c;了解用户需求&#xff0c;提升用户满意度。微信公众号运营一般怎么收费&#xff1f;今天伯乐网络传…

文件扫描模块

文章目录 前言文件扫描模块设计初级扫描方案一实现单线程扫描整合扫描步骤 设计初级扫描方案二周期性扫描 总结 前言 我们这个模块考虑的是数据库里面的内容从哪里获取。 获取完成后&#xff0c;这时候,我们就需要把目录里面文件/子文件都获取出来,并存入数据库。 文件扫描模…

NPM- 滚动进度可视化插件

目录 progress-scroll 滚动进度插件&#x1f4e6; 体验&#x1f30d; 安装&#x1f6f9; 注入&#x1f389; 配置 &#x1f916; 使用方法&#x1f4dd; 使用示例 Demo.vue &#x1f48c; 原理 progress-scroll 滚动进度插件 &#x1f916;&#x1f389;&#x1f389; 您的 进度…

Spring Cloud学习笔记【分布式请求链路跟踪-Sleuth】

文章目录 Spring Cloud Sleuth概述概述主要功能&#xff1a;Sleuth中的术语和相关概念官网 zipkin配置下载运行zipkin下载zipkin运行 demo配置服务提供者 lf-userpom.xmlapplication.ymlUserController 服务调用者 lf-authpom.xmlapplication.ymlAuthController 测试 Spring Cl…

iOS App上架全流程及相关处理

iOS app上架总体流程&#xff1a; 一、IOS上架整个流程 1、申请开发者账号 2、创建APP ID及申请证书 3、itunes connect 创建APP 4、打包 上传APP 5、提交APP&#xff0c;上线成功 1、申请开发者账号 苹果开发者账号主要分为三种&#xff1a;个人账号、公司账号、企业账…

Redis分布式系统: 主从复制

“你小心保管我&#xff0c;不思议的念头。秘密从不会对谁泄漏~” 什么是分布式系统&#xff1f; 分布式系统的出现&#xff0c;就是为了解决单机问题(硬件资源不足)。在分布式系统中&#xff0c;通常会把数据复制多个副本部署到其他服务器&#xff0c;满⾜故障恢复和负载均衡等…

账户权限

目录 1. 文件的一般权限 1.1. 文件详细信息 1.2. 文件权限构成 示例&#xff1a; 1.3. chmod命令 1.3.1. 参数 示例&#xff1a; 扩展&#xff1a;隐藏权限(chattr a) 1.4. chown命令 示例&#xff1a; 2. 特殊权限 2.1. 概述 2.2. SUID权限 2.3. SGID 权限 2.4…