代码随想录第39天 | 62.不同路径 、 63. 不同路径 II

一、前言

参考文献:代码随想录

今天主要的题目是动态规划的路径问题,动态规划五要点;

1、确定dp数组,dp[i]代表什么i代表什么;

2、递推公式;

3、初始化dp数组;

4、遍历顺序;

5、打印dp数组;

二、不同路径

1、思路:

我感觉动态规划,我听的很认真,然后这个题目,我有一点感觉,但是我又想不出来,只好去求看一下卡哥,但是才看了三分钟,我就想到思路了。。。

(1)dp数组,由于这是一个二维图,所以需要创建一个二维的dp数组,i,j分别代表一个点位,dp[i][j]代表到达该点的位置;

(2)初始化:我们发现,机器人只允许向右或者向下移动,所以在[i][0]上面的情况全是1,以及[0][j]也全是1,所以这就是初始化;

(3)递推公式:

当我把图画出来后不难发现当需要拐弯时,那个结点的情况就是上面的路径加上左边的路径;

(图很潦草)但是也能看懂,所以递推公式就是:

dp[i][j] = dp[i - 1][j] + dp[i][j - 1];

(4)遍历顺序:很显然,我们是要慢慢的积累我们不同路径的数量,所以是从最小的地方开始,但是不是用上边界和左边界,而是从[1][1]的地方开始;

2、整体代码如下:

class Solution {
public:int uniquePaths(int m, int n) {// 1、定义dp数组,i,j表示位置,dp[i][j]表示到达结点的次序vector<vector<int>> dp(m, vector<int>(n));// 2、初始化dp数组for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int j = 0; j < n; j++) {dp[0][j] = 1;}// 3、遍历for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {// 4、递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}// 5、打印dp数组// for (int i = 0; i < m; i++) {//     for (int j = 0; j < n; j++) {//         cout << dp[i][j] << " ";//     }//     cout << endl;// }return dp[m - 1][n - 1];}
};

三、不同路径||

1、思路:

这个题目和上一个不同路径的题目思路差不多,但是其中多了障碍物,所以在递推公式上,我们就得分很多种情况,来做出不同的措施;

(1)dp数组,与上一个题目的作用相同;

(2)初始化,这里的初始化就有一些区别。因为在初始化上边界和左边界时可能会出现障碍物,一旦出现,就需要把后面的路径数设置为0:

        for (int i = 0; i < m; i++) {if (obstacleGrid[i][0] == 1) {for (int j = i; j < m; j++) {dp[i][0] = 0;}break;}dp[i][0] = 1;}for (int j = 0; j < n; j++) {if (obstacleGrid[0][j] == 1) {for (int i = j; i < n; i++) {dp[0][j] = 0;}break;}dp[0][j] = 1;}

(3)递推公式:在递推公式中,我们需要做出以下几种情况的判断,

1、如果当前[i][j]位置有障碍物,则直接设置为0;

2、如果上方有障碍物,左边没有:则只累加左边的pd[i - 1][j]数组的值 ;

3、相反,则只累加上方dp[i][j - 1];

4、同时出现障碍物时,dp[i][j]设置为0;

5、没有障碍物,就正常相加;

(4)遍历顺序:

也是从[1][1]开始遍历,从浅带到深;

(5)打印dp数组(debug);

2、整体代码如下:

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {// 获得行数和列数int m = obstacleGrid.size();int n = obstacleGrid[0].size();if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) return 0;// 1、确定dp数组,和上一题类似;vector<vector<int>> dp(m, vector<int>(n));// 2、同样的方法初始化for (int i = 0; i < m; i++) {if (obstacleGrid[i][0] == 1) {for (int j = i; j < m; j++) {dp[i][0] = 0;}break;}dp[i][0] = 1;}for (int j = 0; j < n; j++) {if (obstacleGrid[0][j] == 1) {for (int i = j; i < n; i++) {dp[0][j] = 0;}break;}dp[0][j] = 1;}// 3、遍历顺序for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {// 情况0:当前的坐标有障碍物if (obstacleGrid[i][j] == 1) {dp[i][j] = 0;continue;}// 情况1:左边出现障碍物if (obstacleGrid[i - 1][j] == 1 && obstacleGrid[i][j - 1] != 1) {dp[i][j] = dp[i][j - 1];// 情况2:上方出现障碍物} else if (obstacleGrid[i - 1][j] != 1 && obstacleGrid[i][j -1] == 1) {dp[i][j] = dp[i - 1][j];// 情况3:左右均有障碍物} else if (obstacleGrid[i - 1][j] == 1 && obstacleGrid[i][j -1] == 1){dp[i][j] = 0;// 情况4:没有障碍物} else {dp[i][j] = dp[i][j - 1] + dp[i - 1][j];}}}// 5、打印dp数组// for (int i = 0; i < m; i++) {//     for (int j = 0; j < n; j++) {//         cout << dp[i][j] << " ";//     }//     cout << endl;// }return dp[m - 1][n - 1];}
};

今日学习时间:1.5小时;

 Nobody can stop me.

我无人可当!

 

 

 

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

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

相关文章

Linux常用命令介绍

Linux ### 常用命令&#xff1a; 1、ls命令&#xff1a; 显示当前目录下文件和文件夹。 举例&#xff1a;在用户目录&#xff08;root&#xff09;使用ls可以查看用户里的文件及文件夹。 -l可以详细看列出文件及文件夹, ll命令等价与ls - l 2、cd命令 作用是切换目录。 …

uniapp APP真机调试接口请求不到服务器解决方法

项目场景&#xff1a; 在使用Hbuilder开发uniapp的过程中&#xff0c;出现了两个在 Chrome 调试中正常&#xff0c;但打包后异常的问题&#xff0c;特此记录。 问题描述 在 H5 端请求接口正常请求。 App 端 请求接口&#xff0c;提示 "{"errMsg":"reque…

百万成神-转自九边pro 的分享

1&#xff0c;如果一个人写代码写到10万行左右&#xff0c;也会出现下笔如有神的效果&#xff0c;很多时候自己都不知道自己怎么会想出这么复杂的套路和算法来。 2&#xff0c;我问过那个作者&#xff0c;他是怎么想到的&#xff0c;他说他也不知道&#xff0c;反正每天都写&am…

R语言数据可视化:基本绘图系统

目录 plot函数 par函数 hist函数 boxplot函数 plot函数应用实战 全局参数 R语言中有三大绘图系统包括基本绘图系统&#xff0c;Lattice绘图系统&#xff0c;ggplot2绘图系统 基本绘图系统 在R语言中&#xff0c;以下函数通常用于创建和定制图形&#xff1a; plot 函数…

网络通信三要素:IP、端口和协议

IP&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 IP&#xff1a;全程”互联网协议地址“&#xff0c;是分配给上网设备的唯一标志 IP地址有两种形式&#xff1a; IPv4&#xff1a;32位 IPv6&#xff1a;共128位。分成8段表示&#xff0c;每取四位编码成一个16进制…

分布式技术---------------消息队列中间件之 Kafka

目录 一、Kafka 概述 1.1为什么需要消息队列&#xff08;MQ&#xff09; 1.2使用消息队列的好处 1.2.1解耦 1.2.2可恢复性 1.2.3缓冲 1.2.4灵活性 & 峰值处理能力 1.2.5异步通信 1.3消息队列的两种模式 1.3.1点对点模式&#xff08;一对一&#xff0c;消费者主动…

【御控物联】 1、物联网介绍

文章目录 一、定义二、起源三、发展四、应用五、未来六、技术资料 一、定义 如何理解物联网&#xff0c;我们引用百度百科的一句话“把所有物品通过信息传感设备与互联网连接起来&#xff0c;进行信息交换&#xff0c;即物物相息&#xff0c;以实现智能化识别和管理”&#xf…

【数据结构】AVL树

AVL树 AVL树&#xff08;Adelson-Velsky和Landis树&#xff09;是一种自平衡二叉搜索树。它通过维护树的高度平衡来确保树的操作复杂度为O(log n)。它通过在每个节点上跟踪平衡因子来保持树的平衡。平衡因子是左子树和右子树高度之间的差值。 AVL树的特性 每个节点都有一个平…

机器学习——模型评价

概述 在机器学习中&#xff0c;模型评价是评估和比较不同模型性能的关键步骤之一。它是通过对模型的预测结果与真实标签进行比较&#xff0c;从而量化模型的预测能力、泛化能力和稳定性。模型评价旨在选择最佳的模型&#xff0c;理解模型的行为&#xff0c;并为模型的改进提供…

Synchronized简述

1.了解Synchrozied Synchrozied是一种悲观锁&#xff0c;通过Synchroized实现同步机制&#xff0c;在操作数据时&#xff0c;判断该对象是否被锁定&#xff0c;如果被锁定则进入阻塞状态直到被占用的线程释放&#xff0c;如果没有被锁或者当前线程已经存在操作对象的锁则进行上…

大模型(LLM)与人类大脑的结构及运行机制的关系

大模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;与人类大脑的结构及运行机制之间存在一些有趣的类比和潜在的关联&#xff0c;尽管两者在本质和实现方式上存在显著差异。 首先&#xff0c;从结构上来看&#xff0c;人类大脑是一个高度复杂和互联的网络&am…

SpringBoo利用 MDC 机制过滤出单次请求相关的日志

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1.前言 2.MDC 是什么 3.代码实战 4.总结 1.前言 在服务出现故障时&#xff…

springboot @ConditionalOnProperty注解

ConditionalOnProperty注解可以有条件的加载bean 比如有3个定时任务&#xff0c;想设置开关 1、配置中添加 config:schedule:enabled:aaaScheduler: truebbbScheduler: truecccScheduler: true 2、代码 Component ConditionalOnProperty(prefix "config.schedule.en…

【功能更新】强化知识库管理与AI问答机器人性能

三月HelpLook带来了3大类功能焕新&#xff0c;主要聚焦于&#xff1a;知识库的管理功能升级和AI问答机器人的优化&#xff0c;让我们看看更新了哪些新功能&#xff01; 那么&#xff0c;接下来就让我们来详细了解一下本次升级都带来了哪些新功能吧&#xff01; 知识库使用与管理…

【Linux】应用层协议:HTTP

URL 在之前的文章中我们实现了一个网络版本的计算器&#xff0c;在那个计算器中揉合了协议定制以及序列化反序列化的内容&#xff0c;我们当时也自己定制了一套协议标准&#xff0c;比如请求和响应的格式应该是什么&#xff1f;如何读到一个完整的报文&#xff1f;支持的运算符…

【路径规划】基于六次多项式的多关节机器人避障路径规划

最近迷上了机械臂避障轨迹规划&#xff0c;因为之前一直做的都是无障碍物轨迹规划&#xff0c;所以这次想试一下有障碍物的&#xff0c;把避障算法用在我的SimMechanics机械臂上&#xff0c;看看效果咋样。以下定义不区分路径规划和轨迹规划。   by the way&#xff0c;本文实…

探索CSS世界中的色彩艺术:从基础到实战

在网页设计与布局中&#xff0c;CSS&#xff08;Cascading Style Sheets&#xff09;赋予了我们无尽的创作可能。其中&#xff0c;色彩作为视觉传达的重要元素&#xff0c;直接影响着网站的整体风格与用户体验。本篇教程将带领您踏上CSS颜色的探索之旅&#xff0c;从基础概念到…

二叉树的定义和基本术语及性质

二叉树是一种特殊的树形数据结构&#xff0c;它对每个节点的子节点数进行了限制&#xff0c;即每个节点最多有两个子节点。这种结构使得二叉树成为了许多算法和数据结构的基础&#xff0c;如二叉搜索树、堆、哈夫曼编码等。本文将详细探讨二叉树的定义、基本术语和性质&#xf…

BGP扩展知识总结

一、BGP的宣告问题 在BGP协议中每台运行BGP的设备上&#xff0c;宣告本地直连路由在BGP协议中运行BGP协议的设备&#xff0c;来宣告通过IGP学习到的未运行BGP协议设备产生的路由&#xff1b;&#xff08;常见&#xff09; 在BGP协议中宣告本地路由表中路由条目时&#xff0c;将…

Unity构建详解(8)——SBP的Bundle生成

【WriteSerializedFiles】 这里将实际的写操作执行单独拎了出来共用&#xff0c;放在了IRunCachedCallbacks&#xff0c;但数据的传入和处理还是在Task中执行。 这一步会生成实际的SerializedFile文件&#xff0c;文件名就是之前的InternalName&#xff0c;但这还不是最终的B…