【动态规划】| 路径问题之最小路径和 力扣64

news2024/11/21 21:35:49

🎗️ 主页:小夜时雨
🎗️专栏:动态规划
🎗️如何活着,是我找寻的方向

优雅

目录

  • 1. 题目解析
  • 2. 代码

1. 题目解析

题目链接: https://leetcode.cn/problems/minimum-path-sum/description/
在这里插入图片描述
这道题目和之前一道题 不同路径1力扣62: https://leetcode.cn/problems/unique-paths/description/ 有相似的地方, 建议先去看看那道题整理一下思路, 会简单一些.

通常动态规划的题目有五个大步骤进行解析, 接下来一一来进行分析.

1. 状态表示

动态规划的重点是状态表示, 我们通过状态表示才可以写出正确的状态转移方程, 状态表示我们通常都是根据 经验+题目 要求来进行定义的.
比如本道题又是一个二维的矩阵, 那么依旧可以定义我们的状态表示为

dp[i][j]: 表示到达 (i, j) 这个位置时, 路径上的数字总和为最小

2. 状态转移方程

  • 根据题目要求, 假如我们走到了 (i,j) 位置时, 我们可以从上面往下走或者是从左面往右走, 即是从 (i-1, j) 或者 (i, j-1) 往 (i, j) 的位置走。
  • 根据状态表示, dp[i][j] 的大小可以由两部分组成, 问的是路径总和为最小, 那么共有两条不同的路径: 从左往右走或者从上往下走,求的应该是这二者中的最小值。
  • 从 (0, 0) 走到 (i-1, j) 的最小路径总和假设为 X , 那么从 (0, 0) 走到 (i, j) 的最小路径总和就是 X + nums[i][j], 注意要加上 (i,j)位置的数字。
  • 正好所对应的就是 dp[i - 1][j] 所表示的含义. 同理 dp[i][j - 1] 也是. 那么状态转移方程应如下表示:

dp[i][j] = Math.min(dp[i - 1][j],dp[i][j - 1]) + nums[i][j]

  • 但是有一个细节问题, 这里和不同路径1 不同的是, 这里需要用到原数组,我们通常也是采取多加一行一列的方式来避免出现 dp 表越界的情况, 所以要注意映射关系。
  • 即是遍历 dp 表填表的过程中的 (i, j)对应原数组的值是 nums[i- 1][j - 1] 要注意,后面还会再强调一遍。
    在这里插入图片描述
    3. 初始化

细节问题: 观察状态转移方程可知, 有可能会有越界的风险, 此处我们依旧采取一种多加一行一列的方式来进行初始化.多加一行一列要保证两点:

  1. 虚拟节点的值要保证后面的dp 表里的值是正确的
  2. 要注意下标的映射关系. 因为我们是多加了一行一列, 所以对应到原始数组就应该行列要减一. (此处用到了原数组, 所以要有这个映射关系)

注意 :
这道题的初始化和前两道题有些许不同

  • 原本的dp[0][0] 最小的路径和就是本身自己, 也就是 dp[0][0] = nums[0][0]. 因为我们多加了一行一列, 所以变成了 dp[1][1] = nums[0][0].
  • 观察下图我们发现,填写 dp[1][1] 的时候需要用到左边和上边值, 因为求的是二者中的最小值, 为了不干扰结果, 设置为0即可。
  • 看下图,但是填写 dp[1][2] 的时候,需要用到上面的值 dp[0][2] 和 dp[1][1] 作比较求最小值,倘如是dp[1][2] 还是默认初始化为 0 的话, 就会影响结果,使dp[1][2] = dp[0][2] + nums[0][1], 导致错误了.
  • dp[1][2] 本该是只有一条路径, 那就是用到 (1,1)走到(1,2),就应该是 dp[1][2] = dp[1][1] + nums[0][1]. 观察结果,让 dp[0][2] 是一个非常大的数字,不影响结果即可。此处通常我们设置为整数最大值或者 0x3f3f3f3f.

看图更容易理解
在这里插入图片描述
4. 填表顺序

观察可知, 填 (i, j) 的值的时候需要用到上一行和左边的值. 所以填表顺序是 从上往下, 从左往右.

5. 返回值

根据题目的要求, 要到达(m, n) 最小路径和是多少, 正好对应 dp[m][n] 的表示. 所以返回 dp[m][n] 即可.

2. 代码

动态规划的代码编写一般都是分为 4 个步骤进行:

  1. 创建 dp 表
  2. 初始化
  3. 填表
  4. 返回值
   // 动态规划
   // 是不同路径1 的小幅改动版版: https://leetcode.cn/problems/unique-paths/
   public int uniquePathsWithObstacles(int[][] ob) {
       // 1.创建 dp表
       // 2.初始化
       // 3.填表
       // 4.返回值
       // 动态规划 这里的是二维, 所以时空都是O(M*N)
       int m = ob.length, n = ob[0].length;
       int[][] dp = new int[m + 1][n + 1];
       // dp[1][1] = 1;
       dp[0][1] = 1;
       // 做好映射关系, 原数组的(0,0) 对应dp表中的(1,1)
       // 这里填的是 dp 表, 所以建议从(1,1) 开始, 也就是dp表多加了一行一列
       // 如果是障碍的话, 就直接忽略, 默认就是 0, 也就是表示到不了
       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];
   }

🎗️🎗️🎗️ 好啦,到这里有关本题的分享就没了,如果感觉做的还不错的话可以点个赞,关注一下,你的支持就是我继续下去的动力,我们下期再见,拜了个拜~ ☆*: .。. o(≧▽≦)o .。.:*☆

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

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

相关文章

大模型生成的常见Top-k、Top-p、Temperature参数

参考&#xff1a; https://zhuanlan.zhihu.com/p/669661536 topK&#xff0c;topP https://www.douyin.com/video/7380126984573127945 主要是softmax产生的词表每个词的概率分布后&#xff0c; topK&#xff0c;比如K3&#xff0c;表示采样概率最大的前3个&#xff0c;其他全…

# 梯影传媒T6投影仪刷机方法及一些刷机工具链接

梯影传媒T6投影仪刷机方法及一些刷机工具链接 文章目录 梯影传媒T6投影仪刷机方法及一些刷机工具链接1、安装驱动程序2、备份设备rom【boot、system】3、还原我要刷进设备的rom【system】4、打开开发者模式以便于安装apk5、root设备6、更多好链接&#xff1a; 梯影传媒T6使用的…

经验分享,如何去除文本中的空格

有时候我们需要去掉一窜文本中的空格&#xff0c;这里分享一个好用的免费网站&#xff0c;可实现在线去除 网址&#xff1a;http://www.txttool.com/t/?idMzM4 使用截图&#xff1a;

容器镜像外网同步方案

目录 一、目的 二、安装nexus 1、购买香港云主机​编辑 2、安装nexus 3、启动nexus 服务 4、放行安全组 三、配置nexus 1、登录nexus管理页面 2、修改nexus密码 3、创建 Blob 存储空间(可选) 4、创建 镜像代理仓库 5、Realms配置 四、拉取镜像 1、配置docker 2、…

Java——构造器(构造方法)和 this

一、什么是构造器 构造器&#xff08;Constructor&#xff09;是Java类的一种特殊方法&#xff0c;用于初始化对象的状态。构造器在创建对象时被调用&#xff0c;可以对对象的成员变量进行初始化。 我之前的文章《Java——类和对象-CSDN博客》中也提到了构造器。 二、构造器…

7z压缩文件解压缩遇到文件末端错误

错误如上。我是之前使用7zip压缩软件压缩本地视频为7z格式&#xff0c;然后将压缩包上传到阿里云盘。今天通过阿里云盘下载这个文件&#xff0c;结果使用7zip解压压缩软件 解压缩这个文件遇到“文件末端错误”&#xff0c;然后在网上找了一圈也没有找到解决办法。 我用winrar解…

LoadBalance客户端负载均衡

1. 前言Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。简单的说&#xff0c;Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0…

Python 基础:类

目录 一、类的概念二、定义类三、创建对象并进行访问四、修改属性的值方法一&#xff1a;句点表示法直接访问并修改方法二&#xff1a;通过方法进行修改 五、继承继承父类属性和方法重写父类方法 六、将实例用作属性七、导入类导入单个类从一个模块中导入多个类导入整个模块导入…

简单谈谈云服务器私网IP的存在意义及优势

云服务器是基于虚拟化技术的计算资源&#xff0c;可以在云平台上灵活创建和管理。为了满足不同用户的需求&#xff0c;云服务提供商在云服务器上分配了两种类型的IP地址&#xff1a;公网IP和私网IP。其中&#xff0c;私网IP是指在局域网内使用的内部IP地址&#xff0c;无法通过…

TF-IDF(Term Frequency-Inverse Document Frequency)

TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种常用于信息检索和文本挖掘的统计方法&#xff0c;用以评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。它的重要性随着词语在文本中出现的次数成正比增加&#xff0c;但同时…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 01 为什么需要一个新的网络架构

关于专栏 本专栏是工作之后阅读 Cloud Native Data Center Networking &#xff08; O’Reilly, 2019&#xff09;的读书笔记。这本书是我在数据中心从事云网络工作的启蒙、扫盲读物。可惜&#xff0c;其中文版翻译并非尽善尽美&#xff0c;必须结合英文原版才能理解原作者要表…

xss+csrf项目实例

项目背景&#xff1a; 如下&#xff1a;我们是在一个类似文章管理系统的网站上面发现的该漏洞。我们将其运行在本地的phpstudy集成环境上面。 源码地址下载链接&#xff1a;https://pan.baidu.com/s/1MpnSAq7a_oOcGh4XgPE-2w 提取码&#xff1a;4444 考察内容&#xff1a; …

盗版游戏缺少steamdll文件怎么办?游戏报错steam_api64.dll缺失解决方法

steam_api64.dll 是一个针对64位Windows操作系统设计的动态链接库文件&#xff0c;其核心作用是实现运行在Windows上的应用程序与Steam客户端之间的通信。该文件通常大小在1.5-3.5 MB之间&#xff0c;对于Steam平台的正常运行至关重要。 功能概述&#xff1a; 游戏验证&#…

Linux:线程池

Linux&#xff1a;线程池 线程池概念封装线程基本结构构造函数相关接口线程类总代码 封装线程池基本结构构造与析构初始化启动与回收主线程放任务其他线程读取任务终止线程池测试线程池总代码 线程池概念 线程池是一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影…

第一篇——怎样堵住我们人生错误的源头

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 再次开始了孙子兵法的学习&#xff0c;之前听完就让我醍醐灌顶&#xff0…

Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)

上次介绍了&#xff1a;Linux&#xff1a;基础IO&#xff08;一.C语言文件接口与系统调用、默认打开的文件流、详解文件描述符与dup2系统调用&#xff09; 文章目录 1.缓冲区1.1概念1.2作用与意义 2.语言级别的缓冲区2.1刷新策略2.2具体在哪里2.3支持格式化 3.自己来模拟一下缓…

【数据库编程-SQLite3(一)】sqlite3数据库在Windows下的配置及测试

学习分析 1、资源准备2、环境配置2.1、将资源包下载解压缩保存。2.2、在QT中创建工程,配置环境 3、测试配置3.1、 sqlite3_open函数3.2、sqlite3_close函数3.3、代码测试 1、资源准备 资源包 2、环境配置 2.1、将资源包下载解压缩保存。 解压缩得到以下文件 2.2、在QT中创建…

JavaFX VBox

VBox布局将子节点堆叠在垂直列中。新添加的子节点被放置在上一个子节点的下面。默认情况下&#xff0c;VBox尊重子节点的首选宽度和高度。 当父节点不可调整大小时&#xff0c;例如Group节点&#xff0c;最大垂直列的宽度基于具有最大优选宽度的节点。 默认情况下&#xff0c;…

逢3必过报数游戏-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第84讲。 逢3必过报数游戏&…

guli商城业务逻辑-基础篇笔记

这里写目录标题 0.1 viscode设置用户代码片段1.实现多级菜单接口1.1 对接前端菜单1.2 对接网关接口解决跨域问题&#xff0c;如果不解决跨域&#xff0c;浏览器还是访问不了api1.3 把商品服务添加网关1.4 修改前端显示分类菜单1.5 给菜单添加删除修改功能1.5.1 删除功能的后端业…