leetcode63.跳跃游戏2(动态规划)

2024-05-10 06:44

本文主要是介绍leetcode63.跳跃游戏2(动态规划),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

示例一:

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

 对应的图片:

示例二:

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

对应的图片:

问题解决:

这道题与跳跃游戏那道题基本一样,只是多了障碍物。

1.状态表示

因为本题是二维表格的最短路径,所以dp数组也要是二维的:

dp[i][j]表示走到 [i,j] 的时候一共有多少种不同的路径

2.状态转移方程

要想求到达dp[i][j]一共有多少条路径,题干规定机器人每次只能向下或者向右移动一步,首先得判

断对应的节点是不是有障碍,如果有,直接返回0,没有就必须知道到达dp[i - 1][j]有多少条路径,

还有到达dp[i][j - 1]有多少条路径,这两条路径不是二选一,而是全都满足条件,所以应该全部加到

dp[i][j]中。

对应dp[i][j]的状态转移方程:

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

3.初识化一些值:

这道题要直接进行初始化,初始化的值很多,需要将第一行和第一列的之全部初始化,不然就会有

位置找不到有多少条路径,这是就要与上次解码方法类似添加一行一列辅助节点,同样是两个问

题:

1.如何填写虚拟节点里面的值,使之后的填表顺序进行?

其实在添加了一行一列辅助虚拟节点之后,最需要虚拟节点的是原来的第一行和第一列的dp数组表

那么元dp数组的左上角应该填的是什么,从起点出发到达起点只有一种方法,所以应该填写1,但

是要通过这些虚拟头节点来实现左上角的值为1,而且也满足其他要初始化的节点,所以可以在添

加了虚拟数组之后,在第一行第二列将其赋值为1,也可以将第二行第一列的节点赋值为1,

这样就只用初始化一个节点了。

2.关于添加了虚拟节点的数组和dp数组的映射关系

因为这道题传的是二维数组,所以在访问其元素时一定要记得将dp对应的位置的下标 - 1 之后在进

行访问,这才是我们想要访问的所传的数组中的元素。

4.填表顺序

每一行从上到下

行里每一列从左到右

5.返回值

dp[m][n],应为添加了虚拟节点,数组也变大了,所以要求的结果是对应dp[m][n],其中m是行数

n是列数。

对应代码:

class Solution 
{
public:int uniquePathsWithObstacles(vector<vector<int>>& ob) {//1.创建dp表//2.初始化//3.填表//4.返回值int m = ob.size(), n = ob[0].size();vector<vector<int>> dp(m + 1,vector<int>(n + 1));dp[1][0] = 1;for(int i = 1;i <= m;i++) {for(int j = 1;j <= n;j++){if(ob[i - 1][j - 1] == 0){dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[m][n];}
};

这就是这道题的解法,只需增加判断有没有障碍即可。
 

这篇关于leetcode63.跳跃游戏2(动态规划)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975730

相关文章

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可