【动态规划刷题 2】不同路径不同路径 II

news2024/11/15 13:53:19

不同路径

62 . 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
在这里插入图片描述
输入:m = 3, n = 7
输出:28

示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向下

示例 3:
输入:m = 7, n = 3
输出:28

示例 4:
输入:m = 3, n = 3
输出:6

1.状态表示

dp[i][j] 表示的是走到[i][j]位置时候的所有路径数量。

2.状态转移方程

动态规划题,我们需要学会依靠经验和题目解析去猜测他们的状态转移方程。
走到[i][j]位置时,根据题意,有两种情况:

  1. 从 [i-1][j]位置 向上走一步到 [i][j];
  2. 从 [i][j-1]位置 向右走一步到 [i][j];

所以dp[i] 的值是这两种情况的方法总和:

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

3. 初始化
从递推公式可以看出,我们需要初始化 dp[0][j] 这一行和 dp[i][0] 这一列,
初始化比较繁琐,我们可以将初始化dp[0][j] 这一行和 dp[i][0] 这一列 这一步骤放入填表中。

可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:

  1. i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
  2. ii. 「下标的映射关系」。

在本题中「添加⼀⾏」,并且「添加⼀列」后,只需将 dp[0][1] 的位置初始化为 1 即可。
在这里插入图片描述

4. 填表顺序
填表的顺序就是「从上往下」填每⼀⾏,在填写每⼀⾏的时候「从左往右」。

5. 返回值
应该返回 dp[m][n] 的值。

代码:

  int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        dp[0][1]=1;
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m][n];
    }

在这里插入图片描述

不同路径 II

63 . 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。

在这里插入图片描述
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

1.状态表示

dp[i][j] 表示的是走到[i][j]位置时候的所有路径数量。

2.状态转移方程

动态规划题,我们需要学会依靠经验和题目解析去猜测他们的状态转移方程。
走到[i][j]位置时,根据题意,有两种情况:

  1. 从 [i-1][j]位置 向上走一步到 [i][j];
  2. 从 [i][j-1]位置 向右走一步到 [i][j];

但是当 某个位置出现障碍物时 ,比如在 [2][3] 位置上有障碍物,我们无法从[2][3] 走到 [3][3] 或者 [2][4],所以dp[2][3] 的值为 0;

所以dp[i] 的值是 0 和:

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

3. 初始化
从递推公式可以看出,我们需要初始化 dp[0][j] 这一行和 dp[i][0] 这一列,
初始化比较繁琐,我们可以将初始化dp[0][j] 这一行和 dp[i][0] 这一列 这一步骤放入填表中。

可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:

  1. i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
  2. ii. 「下标的映射关系」。

在本题中「添加⼀⾏」,并且「添加⼀列」后,只需将 dp[0][1] 的位置初始化为 1 即可。
在这里插入图片描述

4. 填表顺序
填表的顺序就是「从上往下」填每⼀⾏,在填写每⼀⾏的时候「从左往右」。

5. 返回值
应该返回 dp[m][n] 的值。

代码:

 int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m=obstacleGrid.size();
        int n=obstacleGrid[0].size();
          
        vector<vector<int>> dp(m+1,vector<int>(n+1));
         dp[0][1]=1;
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(obstacleGrid[i-1][j-1]==1) dp[i][j]=0;
                else dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m][n];
    }

在这里插入图片描述

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

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

相关文章

iPhone 安装 iOS 17公测版(Public Beta)

文章目录 步骤1. 备份iPhone资料步骤2. 申请iOS 17 公测Beta 资格步骤3. 下载iOS 16 Beta 公测描述档步骤4. 选择iOS 17 Beta 公测描述档更新项目步骤5. 升级iOS 17 Public Beta 公开测试版 苹果已经开始向大众释出首个iOS 17 公开测试版/ 公测版( iOS 17 Public Beta)&#xf…

【C++】类和对象 - 上

目录 1. 面向过程和面向对象初步认识2. 类的引入3. 类的定义4. 类的访问限定符及封装4.1 访问限定符4.2 封装 5. 类的作用域6. 类的实例化7. 类对象模型7.1 如何计算类的大小7.2 类对象的存储方式猜测7.3 结构体内存对齐规则 8. this指针8.1 引出8.2 this指针的特性 总结 1. 面…

ES查看集群信息(健康状态、分片、索引等)

1、查看集群状态使用频率最高的方法 http://192.168.1.101:9200/ 注意&#xff1a;不同环境的ip不同 一般我们通过这个方式来验证ES服务器是否启动成功。 2、_cat/health 查看集群健康状态 [rootCENTOS01 ~]# curl http://192.168.1.101:9200/_cat/health?v epoch tim…

Spring Data【Spring Data Redis、Spring Data ElasticSearch】(二)-全面详解(学习总结---从入门到深化)

目录 四、 Spring Data Redis 五、 Spring Data ElasticSearch 四、 Spring Data Redis Redis 是一个基于内存的数据结构存储系统&#xff0c;它可以用作数据库或者缓存。它支持多种 类型的数据结构&#xff0c;这些数据结构类型分别为 String&#xff08;字符串&#xff09…

0基础系列C++教程 从0开始 第四课

目录 来学习新的内容吧 1 输入 第四课课后习题1&#xff1a; 2 变量 怎么定义变量&#xff1f; 定义变量 第四课课后习题2&#xff1a; 来学习新的内容吧 1 输入 C中既然有了输出 那必然有输入 这时 我们就要用到 cin 函数啦 cin 用法与cout 相似 但却有一个差异 co…

Vue(十八):echarts地图省市区联动

效果 数据来源 https://datav.aliyun.com/portal/school/atlas/area_selector 接口请求地址 https://geo.datav.aliyun.com/areas_v3/bound/geojson?code100000_full 源码 样式 .map {width: 1000px;height: 700px; }布局 <template><div class"map">…

linux -网络编程-多线程并发服务器

目录 1.三次握手和四次挥手 2 滑动窗口 3 函数封装思想 4 高并发服务器 学习目标&#xff1a; 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器 1.三次握手和四次挥手 思考: 为什么…

linux centos7 安装java17

删除旧版本的java或者说是自带的&#xff0c;免得干扰 查找java rpm -qa|grep java java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 javapackages-tools-3.4.1-11.el7.noarch tzdata-java-2020a-1.el7.noarch python-javapackages-3.4.1-11.el7.noarch java-1.8.0-open…

力扣热门100题之矩阵置0【中等】

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例 2&#xff…

❤️创意网页:萌翻少女心的果冻泡泡 - 创造生动有趣的视觉效果

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

计算机网络(Computer Networks)基础

本篇介绍计算机网络的基础知识。 文章目录 1. 计算机网络历史2. 以太网" (Ethernet)2.1 以太网" (Ethernet)的简单形式及概念2.2 指数退避解决冲突问题2.3 利用交换机减少同一载体中设备2.4 互联网&#xff08;The Internet&#xff09;2.5 路由(routing)2.6 数据包…

渗透测试基础知识(1)

渗透基础知识一 一、Web架构1、了解Web2、Web技术架构3、Web客户端技术4、Web服务端组成5、动态网站工作过程6、后端存储 二、HTTP协议1、HTTP协议解析2、HTTP协议3、http1.1与http2.0的区别4、HTTP协议 三、HTTP请求1、发起HTTP请求2、HTTP响应与请求-HTTP请求3、HTTP响应与请…

typedef对类型的重命名

typedef 重命名的类型 重命名后的类型名 typedef重命名函数指针类型时的特别写法 正确的重命名函数指针类型的方式 运用&#xff1a; 用typedef简化下面这个代码 简化后&#xff1a;

【C语言day11】

数据类型的等级从低到高如下&#xff1a;char int long float double运算的时候是从低转到高的&#xff0c;表达式的类型会自动提升或者转换为参与表达式求值的最上级类型 #include <stdio.h> int main() {int x -1;unsigned int y 2;if (x > y){printf("x is …

使用Express部署Vue项目

使用Express部署Vue项目 目录 1. 背景 2. 配置Vue CLI 1.1 安装nodejs 1.2 创建vue-cli 1.3 创建vue项目 1.4 构建vue项目3. 配置Express 2.1 安装express 2.2 创建项目4. 使用express部署vue项目 1&#xff0c;背景 我们想要做一个前后端分离的课程项目&#xff0c;前端…

nacos2.2.3最新版启动所遇到的问题总结

前言 有问题就看官方文档&#xff0c;看不懂或者还是报错再看博客&#xff01;因为有时候忙的焦头烂额&#xff0c;却发现官方写的非常清楚&#xff0c;而且人家还自带一个example示例&#xff0c;自己都没有看&#xff0c;自己瞎折腾&#xff01;本人吃过亏&#xff0c;特此提…

svo2论文

论文题目 SVO: Semidirect Visual Odometry for Monocular and Multicamera Systems 内容 1&#xff09; 具有最小特征漂移的长特征轨迹&#xff1b; 2&#xff09; 图像平面中的大量均匀分布的特征&#xff1b; 3&#xff09;新特征与旧地标的可靠关联&#xff08;即环路闭…

mybatisPlus主键策略解读

目录 主键生成策略介绍 AUTO策略 INPUT策略 ASSIGN_ID策略 NONE策略 ASSIGN_UUID策略 主键生成策略介绍 主键的作用就是唯一标识&#xff0c;我们可以通过这个唯一标识来定位到这条数据。当然对于表数据中的主键&#xff0c;我们可以自己设计生成规则&#xff0c;生成主键…

收藏与掘出 沉淀与成长

收藏从未停止&#xff0c;练习从未开始——掘出那些闪光的宝藏 目录 引言&#xff1a;收藏的深意分享一道你收藏的好题分享一个你收藏的便捷技巧积灰这么久&#xff0c;这个当时被你收藏的东西对现在的你还有用吗&#xff1f;结语&#xff1a;掘出 引言&#xff1a;收藏的深意 …

Python(二)

最怕你一生碌碌无为&#xff0c;还安慰自己平凡可贵。 --可以import 函数 变量 类啊 等等 -- 不一 一写了 大家自己写吧 -- 命名尽量不要使用大写或者中文 --比较运算符 又名 关系运算符 后面更新&#xff0c;请看后续 Python(二)