【LeetCode】动态规划—63. 不同路径 II(附完整Python/C++代码)

动态规划—63. 不同路径 II

  • 前言
  • 题目描述
  • 基本思路
    • 1. 问题定义:
    • 2. 理解问题和递推关系:
    • 3. 解决方法:
      • 3.1 动态规划方法
      • 3.2 空间优化的动态规划
    • 4. 进一步优化:
    • 5. 小总结:
  • 代码实现
    • Python3代码实现
    • Python 代码解释
    • C++代码实现
    • C++ 代码解释
  • 总结:

前言

本文将探讨“不同路径 II”这一问题,定义了在一个有障碍物的网格中,从起点到终点的路径数计算方法。我们将从基本概念入手,逐步深入理解问题的递推关系、动态规划的解决方案及其优化方法。通过详细的解释和代码示例,我们希望能帮助读者更好地掌握动态规划的思想与应用,提升解决复杂问题的能力。

题目描述

在这里插入图片描述

基本思路

1. 问题定义:

给定一个 m ∗ n m * n mn 的网格,其中有一些障碍物。机器人从左上角(起始点)出发,只能向下或向右移动,目标是到达右下角(终点)。问总共有多少条不同的路径可以到达终点,路径上不得经过障碍物。

2. 理解问题和递推关系:

  • 问题的本质是计算从起点到终点的所有可能路径数,但需要考虑障碍物的影响。
  • 关键观察:到达某个点的路径数等于到达其上方点的路径数加上到达其左方点的路径数,但若某个点是障碍物,则路径数为0。
  • 递推关系:设 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示到达位置 ( i , j ) (i, j) (i,j) 的不同路径数,则:
    • 如果该位置是障碍物, d p [ i ] [ j ] = 0 dp[i][j] = 0 dp[i][j]=0
    • 否则, d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j] = dp[i-1][j] + dp[i][j-1] dp[i][j]=dp[i1][j]+dp[i][j1]
  • 边界条件:第一行和第一列的路径数初始化为 1 1 1,若位置是障碍物则设为 0 0 0

3. 解决方法:

3.1 动态规划方法

  1. 创建一个 m ∗ n m * n mn 的二维数组 dp。
  2. 初始化第一行和第一列的值为 1 1 1(遇到障碍物时设为 0 0 0)。
  3. 从左上到右下填充 dp 数组,使用递推公式: d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j] = dp[i-1][j] + dp[i][j-1] dp[i][j]=dp[i1][j]+dp[i][j1],考虑障碍物的情况。
  4. 最终结果为 d p [ m − 1 ] [ n − 1 ] dp[m-1][n-1] dp[m1][n1]

3.2 空间优化的动态规划

  1. 使用一维数组 dp 代替二维数组。
  2. 初始化 dp 数组的所有元素为0,第一列和第一行根据障碍物初始化。
  3. 逐行更新 dp 数组,每次更新时,当前值等于其自身(上一行的值)加上前一个元素(左边的值)。
  4. 最终结果为 dp[n-1]。

4. 进一步优化:

  • 尽管空间优化已减少了复杂度,仍然可以考虑:
    • 如果输入很大,可以采用更高效的数学模型或其他算法,但在此问题中,动态规划已较为高效。

5. 小总结:

  • 动态规划方法提供了直观且易于理解的解法,适用于理解路径问题的本质。
  • 空间优化的方法显著降低了空间复杂度,适用于处理大规模输入。
  • 这个问题是动态规划的经典案例,掌握它对于解决类似问题非常有帮助。理解障碍物的处理逻辑是动态规划中的重要技巧。

以上就是不同路径II 问题的基本思路。

代码实现

Python3代码实现

class Solution:def uniquePathsWithObstacles(self, obstacleGrid: list[list[int]]) -> int:if not obstacleGrid or not obstacleGrid[0]:return 0rows, cols = len(obstacleGrid), len(obstacleGrid[0])# 创建 dp 数组dp = [[0] * cols for _ in range(rows)]# 初始化第一行for j in range(cols):if obstacleGrid[0][j] == 1:break  # 遇到障碍物,后续路径数为0dp[0][j] = 1# 初始化第一列for i in range(rows):if obstacleGrid[i][0] == 1:break  # 遇到障碍物,后续路径数为0dp[i][0] = 1# 填充 dp 数组for i in range(1, rows):for j in range(1, cols):if obstacleGrid[i][j] == 1:dp[i][j] = 0  # 障碍物else:dp[i][j] = dp[i-1][j] + dp[i][j-1]return dp[rows-1][cols-1]

Python 代码解释

在 Python 实现中,我们创建了一个二维数组 dp 用于存储到达每个点的路径数。首先初始化第一行和第一列,如果遇到障碍物,则设置路径数为0。接着,使用双重循环填充 dp 数组,根据之前讨论的递推关系进行计算。最终,返回右下角的路径数,即 dp[rows-1][cols-1]。

C++代码实现

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {if (obstacleGrid.empty() || obstacleGrid[0].empty()) return 0;int rows = obstacleGrid.size();int cols = obstacleGrid[0].size();// 创建 dp 数组vector<vector<int>> dp(rows, vector<int>(cols, 0));// 初始化第一行for (int j = 0; j < cols; ++j) {if (obstacleGrid[0][j] == 1) break;  // 遇到障碍物dp[0][j] = 1;}// 初始化第一列for (int i = 0; i < rows; ++i) {if (obstacleGrid[i][0] == 1) break;  // 遇到障碍物dp[i][0] = 1;}// 填充 dp 数组for (int i = 1; i < rows; ++i) {for (int j = 1; j < cols; ++j) {if (obstacleGrid[i][j] == 1) {dp[i][j] = 0;  // 障碍物} else {dp[i][j] = dp[i-1][j] + dp[i][j-1];}}}return dp[rows-1][cols-1];}
};

C++ 代码解释

C++ 实现采用了 STL 的 vector 来动态创建和存储二维数组。与 Python 类似,我们首先初始化第一行和第一列的路径数,然后在嵌套循环中使用递推关系填充 dp 数组。C++ 的语法相对严格,但通过合理的注释,读者可以清楚地理解每一步的逻辑。


总结:

动态规划方法为解决带障碍物的路径问题提供了清晰且高效的解决方案。通过对 Python 和 C++ 代码的实现,我们展示了如何利用动态规划思想来应对复杂问题。掌握这些技巧不仅能帮助我们解决类似的路径问题,也为理解更复杂的动态规划问题打下了坚实的基础。

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

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

相关文章

图神经学习笔记

图神经网络基础 图神经网络用于挖掘事物的“普遍联系”&#xff0c;理解原理、应用技术。本文汇总图神经网络相关介绍和基础模型。 图及特性 图是由顶点和边组成的&#xff0c;如下图左所示。一般图中的顶点表示实体对象&#xff08;比如一个用户、一件商品、一辆车、一张银行…

Apache Solr:深入探索与常见误区解析

Apache Solr&#xff1a;深入探索与常见误区解析 Apache Solr 是一个强大的搜索引擎&#xff0c;基于 Lucene 构建&#xff0c;广泛应用于电商平台、日志分析、内容管理系统等领域。Solr 的功能强大&#xff0c;然而它的配置和使用过程却不乏一些容易误解和出错的地方。本文将…

“AI+Security”系列第3期(六):打造最懂安全的智能体-无极AI安全智能体平台落地与实践

近日&#xff0c;由安全极客、Wisemodel 社区、InForSec 网络安全研究国际学术论坛和海升集团联合主办的 “AI Security” 系列第 3 期技术沙龙&#xff1a;“AI 安全智能体&#xff0c;重塑安全团队工作范式” 活动顺利举行。此次活动吸引了线上线下超过千名观众参与。 活动…

卡方检验及其在Python中的应用

作者简介&#xff1a;热爱数据分析&#xff0c;学习Python、Stata、SPSS等统计语言的小高同学~个人主页&#xff1a;小高要坚强的博客当前专栏&#xff1a;Python之机器学习本文内容&#xff1a;卡方检验及其在Python中的应用作者“三要”格言&#xff1a;要坚强、要努力、要学…

使用 Napkins.dev 将草图转换为应用程序

在现代前端开发中&#xff0c;快速将设计草图转换为实际的应用程序代码是一个巨大的优势。Napkins.dev 是一个利用人工智能将网站设计草图转换成实际应用程序的平台。本文将介绍如何使用 Napkins.dev 进行这一过程。 什么是 Napkins.dev&#xff1f; Napkins.dev 是一个开源平…

【DS】红黑树

目录 红黑树的介绍红黑树节点的定义红黑树的插入红黑树的调整情况一情况二情况三 红黑树的验证红黑树与AVL树的比较 在上一篇AVL树的实现中&#xff0c;学习了平衡二叉树的一种——AVL树&#xff1b;由于AVL树极度追求平衡&#xff0c;因此它的查找效率十分高效&#xff1b;但也…

虚拟机文件系统根目录上的磁盘空间不足?VMware虚拟机扩容磁盘步骤讲解

VMware虚拟机扩容磁盘步骤讲解 今天使用vmware&#xff0c;想使用Ubuntu虚拟机&#xff0c;结果出现这种情况&#xff1a; 我的环境&#xff1a; Ubuntu20.04 VMWare workstation pro 17 VMware设置 参考链接&#xff1a; https://blog.csdn.net/hktkfly6/article/details…

2024年9月26日 linux笔记

1、提示符 1.1 提示符 1.2 命令格式 1.3 路径 2、指令 2.1 pwd 显示当前路径 2.2 cd 切换路径、改变路径 2.3 mkdir 创建目录 [-p] 创建目录及子目录 mkdir -p dir1/dir2 2.4 rmdir 删除目录 &#xff08;注&#xff1a;不能删除空目录&#xff09; 2.5 ls 显示当前目录文…

【行为树】06-重新映射树和子树之间的端口

Remapping ports between Trees and SubTrees 重新映射树和子树之间的端口 在CrossDoor示例中&#xff0c;我们看到一个SubTree从其父节点&#xff08;示例中的MainTree&#xff09;的角度看起来像一个单独的叶子节点。 此外,为了避免在非常大的树中发生名称冲突,任何树和子…

【cache】浅析四种常用的缓存淘汰算法 FIFO/LRU/LFU/W-TinyLFU

本文浅析淘汰策略与工作中结合使用、选取&#xff0c;并非针对算法本身如何实现的 文章目录 FIFOLFULRUW-TinyLFU实践与优化监控与调整 FIFO first input first output &#xff0c; 先进先出&#xff0c;即最早存入的元素最先取出&#xff0c; 典型数据结构代表&#xff1a;…

当大模型成为新一代操作系统,我们如何转型AI产品经理?

大模型无疑是最近科技圈最炙手可热的时尚单品&#xff0c;跟AIGC能沾上边的工作岗位都成为行业香饽饽。许多产品经理朋友与斯年讨论如何转型AI产品经理&#xff0c;今天想通过用户体验五要素的逻辑框架&#xff0c;谈谈传统型产品经理 VS. AI型产品经理的差异。最后分享几点在转…

【深度学习】(9)--调整学习率

文章目录 调整学习率一、学习率的定义二、学习率的作用三、实现调整学习率1. 使用库函数进行调整2. 手动调整学习率 总结 调整学习率 调整学习率的目的是&#xff1a;通过调整学习率&#xff0c;优化训练速度、提高训练稳定性、适应不同的训练阶段以及改善模型性能。那么&…

不可错过的10款文件加密软件,企业电脑加密文件哪个软件好用

在信息安全日益重要的今天&#xff0c;企业和个人都需要可靠的文件加密软件来保护敏感数据。以下是2024年不可错过的10款文件加密软件&#xff0c;它们以强大的加密功能和易用性而闻名。 1.安秉加密软件 安秉加密软件是一款专为企业设计的信息安全管理工具&#xff0c;采用驱动…

Android系统应用安装完成后是如何通知其他应用的?

文章目录 具体步骤如下&#xff1a;相关的系统广播&#xff08;Actions&#xff09;&#xff1a;总结&#xff1a; Android系统在应用安装完成后&#xff0c;会通过 广播&#xff08;Broadcast&#xff09;的方式通知其他应用。这个广播称为"应用安装完成广播"&…

IBM开源新模型,可完美、快速转换PDF文档格式,附源码详细部署教程使用教程

IBM开源新模型&#xff0c;可完美、快速转换PDF文档格式&#xff0c;附源码详细部署教程使用教程。 docling 是一个由 DS4SD&#xff08;Data Science for Social Development&#xff09;团队开发的开源项目&#xff0c;旨在帮助文档化软件项目。该项目提供了一个基于 Flask 的…

在 OpenEuler 中配置 KVM 虚拟化环境指南

本指南旨在为读者提供一个详细的步骤说明&#xff0c;帮助大家在 OpenEuler 系统中配置 KVM 虚拟化环境。无论您是初学者还是有一定经验的用户&#xff0c;这份指南都将涵盖从环境准备、安装到虚拟机管理的各个方面&#xff0c;确保您能够顺利地搭建并管理自己的虚拟化平台。 …

写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这十个数字)

题目分析&#xff0c;一共需要最多需要36个位置的数组&#xff0c;我们把前十个数组位置给0-9个数字字符存放空间&#xff0c;10-36的数组空间给到A-Z的存放 int main() {printf("请输入一串字符串内容,并且以#结束输入\n");char arr[36], ch;//26个大写字符10个数字…

重磅!2025年国自然项目指南,发布时间确定!

9月25日&#xff0c;基金委官网发布《《2025年度国家自然科学基金项目指南》征订通知》&#xff0c;据通知&#xff0c;《2025年度国家自然科学基金项目指南》预计于2025年1月中旬正式出版&#xff0c;届时将以电子和纸质两种形式同步刊出&#xff0c;纸质版48元\套&#xff0c…

高校实训产品:教育AI人工智能实训与科研解决方案

保持前沿、提升就业、低成本的教育AI实训全场景方案 产品概述 AIGC实训云图站解决方案为高校提供了灵活、高效的人工智能实训平台。通过弹性裸金属调度技术和GPU虚拟化&#xff0c;实现高性能与低成本的兼顾&#xff0c;为学生和教师提供不受时间和空间限制的实操机会。平台涵…

SpringBoot使用validation进行自参数校验

一&#xff1a;介绍 在 SpringBoot 项目开发中&#xff0c;很多与数据库交互的参数需要校验数据正确性。很多小伙伴会把参数判断写进代码里&#xff0c;但是这种写法往往会有低可读性以及多处使用的时候&#xff0c;需要变更验证规则时&#xff0c;不易于维护等缺点。今天给大家…