「动态规划」如何求最小路径和?

64. 最小路径和icon-default.png?t=N7T8https://leetcode.cn/problems/minimum-path-sum/description/

给定一个包含非负整数的m x n网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。

  1. 输入:grid = [[1,3,1],[1,5,1],[4,2,1]],输出:7,解释:因为路径1→3→1→1→1的总和最小。
  2. 输入:grid = [[1,2,3],[4,5,6]],输出:12。

提示:m == grid.length,n == grid[i].length;1 <= m, n <= 200,0 <= grid[i][j] <= 200。


我们用动态规划的思想来解决这个问题。

确定状态表示:根据经验和题目要求,我们用dp[i][j]表示:到达[i, j]位置处,最小路径和是多少

推导状态转移方程:要想到达[i, j]位置,只有2种情况:

  • 先到达[i - 1, j]位置,再向下走一步,到达[i, j]位置。此时的最小路径和就等于,到达[i - 1, j]位置的最小路径和加上网格中[i, j]位置的值,即dp[i - 1][j] + grid[i][j]。
  • 先到达[i, j - 1]位置,再向右走一步,到达[i, j]位置。此时的最小路径和就等于,到达[i, j - 1]位置的最小路径和加上网格中[i, j]位置的值,即dp[i][j - 1] + grid[i][j]。

到达[i, j]位置的最小路径和,应该等于这两种情况的较小值,即dp[i][j] = min(dp[i - 1][j] + grid[i][j], dp[i][j - 1] + grid[i][j]) = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]

初始化:观察状态转移方程,我们发现,在计算dp表最上面一行和最左边一列的值时,会出现越界访问,所以我们要对其初始化。这里我们用增加辅助结点的方式来初始化。我们在dp表的最上面和最左边分别加上一行一列辅助结点。接着,我们要考虑,如何初始化辅助结点,才能确保后续的填表是正确的。我们先把此时的dp表画出来:

* * * *
* ? ? ?
* ?

不难意识到,左上角的?位置的值就应该是网格左上角的值。再根据状态转移方程,我们只需要让min(dp[i - 1][j], dp[i][j - 1])这一项等于0,就能符合预期。所以,我们只需要让左上角的?位置,它的上面和左边2个*位置的值初始化为0即可。

* 0 * *
0 ? ? ?
* ?

接下来考虑除了左上角的?位置之外,其他的?位置的值。为了让这些?位置的值符合预期,我们就要让min(dp[i - 1][j], dp[i][j - 1])这一项中,*位置的值不影响结果。所以,我们要把这些*都初始化为+∞。由于并没有导致溢出风险的运算,用INT_MAX代表+∞即可。

综上所述:我们要在dp表的最上面和最左边分别加上一行一列辅助结点,并且把[0, 1]位置和[1, 0]位置初始化为0,其余辅助结点初始化为INT_MAX

填表顺序:根据状态转移方程,dp[i][j]依赖于dp[i - 1][j]和dp[i][j - 1]这2项,所以应从上往下,从左往右填表

返回值:根据状态表示,显然应返回dp表右下角的值,即dp[m][n],对应到达网格右下角的最小路径和。

细节问题:由于新增了一行一列辅助结点,所以dp表的规模比网格的规模大一行一列,即dp表的规模为(m + 1) x (n + 1)。由于添加了辅助结点,要时刻注意下标的映射关系,dp表的[i, j]位置对应网格的[i - 1, j - 1]位置

时间复杂度:O(m x n),空间复杂度:O(m x n)。

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();

        // 创建dp表
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));

        // 初始化
        dp[0][1] = dp[1][0] = 0;

        // 填表
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
            }
        }

        // 返回结果
        return dp[m][n];
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

短视频矩阵源码----如何做正规开发规则分享:

一、什么是SaaS化服务技术开发&#xff1f; &#xff08;短视频矩阵系统是源头开发的应该分为3个端口---- 总后台控制端、总代理端口&#xff0c;总商户后台&#xff09; SaaS是软件即服务&#xff08;Software as a Service&#xff09;的缩写。它是一种通过互联网提供软件应…

jvm学习笔记(二) ----- 垃圾回收

GC 一、判定对象是否是垃圾1.引用计数法2.可达性分析算法 二、垃圾回收算法1.标记清除2.标记整理3. 复制4. 分代垃圾回收1.尝试在伊甸园分配2.大对象直接晋升至老年代3.多次存活的对象4.老年代连续空间不足&#xff0c;触发 Full GC 链接: jvm学习笔记(一) ----- JAVA 内存 链接…

Android存储空间不足?试试这8个快速解决方案!

在当今的科技时代&#xff0c;Android智能手机已成为我们日常生活的重要组成部分&#xff0c;因为它们保存着我们大量的关键数据。然而&#xff0c;随着我们的使用模式不断扩大&#xff0c;手机内部存储的可用性经常变得有限。手机存储空间不足不仅会损害设备的功能和响应能力&…

代码随想录第27天|贪心算法part1

455.分发饼干 先给孩子和饼干排序&#xff0c;每次选取一个最大的饼干给一个最大胃口的孩子&#xff0c;直到饼干分完或者遍历完孩子 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(…

django ORM model update常规用法

Django ORM&#xff08;对象关系映射&#xff09;提供了一种强大而直观的方式&#xff0c;通过Python类和方法与数据库交互。在Django模型中更新记录是一个常见的任务&#xff0c;可以通过多种方式完成。以下是一些常见的更新记录的方法&#xff1a; 1. 更新单条记录 使用 sa…

ORA-12519 TNS:no appropriate service handler found

问题描述 jdbc连接Oracle失败&#xff0c;报错日志如下&#xff1a; Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found The Connection descriptor used by the client was:192.9.100.217:7001:wcm 问题分…

解决Nginx出现An error occurred问题

每个人遇到Nginx的An error occurred情况可能都不一样&#xff08;见图1&#xff09;&#xff0c;Nginx造成该错误的原因&#xff1a; 1. 我在配置域名解析成IP时&#xff0c;没有把所有解析配置都修改&#xff0c;见图2&#xff1a;解析 *.hanxiaozhang.xyz 配置的是新IP地…

Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库

Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库 目录 Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库 一、简单介绍 二、scikit-learn 基础 1、安装 scikit-learn 2、导入 scikit-learn 3、数据准备 4、数据分割 5、训练模…

将web项目打包成electron桌面端教程(二)vue3+vite+ts

说明&#xff1a;我用的demo项目是vue3vitets&#xff0c;如果是vue2/cli就不用往下看啦&#xff0c;建议找找其他教程哦~下依赖npm下载不下来的&#xff0c;基本换成cnpm/pnpm/yarn就可以了 一、项目准备 1、自己新创建一个&#xff0c;这里就不过多赘述了 2、将需要打包成…

[matlab]折线图之多条折线如何绘制实心圆作为标记点

使用MarkerFaceColor是标记点填充的颜色&#xff0c;b&#xff0c;表示blue&#xff0c;蓝色 plot(x, a, d--, MarkerFaceColor, b); % 绘制仿真结果的曲线如果一张图多条曲线那么每条曲线需要单独调用一次plot&#xff0c;每个plot间用hold on 连接 plot(x, a, d--, MarkerF…

sick0s1.1 靶机实战

sick0s1.1 信息收集 nmap存活及端口&#xff1a; nmap服务扫描&#xff1a; web 80和8080都没有开放&#xff0c;&#xff0c;无法访问&#xff0c;gobuster等工具也跑不了&#xff0c;访问一下3128试试 根据端口服务扫描也能得知这是个http的代理服务器&#xff0c;&#x…

6.6SSH的运用

ssh远程管理 ssh是一种安全通道协议&#xff0c;用来实现字符界面的远程登录。远程复制&#xff0c;远程文本传输。 ssh对通信双方的数据进行了加密 用户名和密码登录 密钥对认证方式&#xff08;可以实现免密登录&#xff09; ssh 22 网络层 传输层 数据传输的过程中是加密的 …

js解析成语法树以及还原

const {parse} require("babel/parser"); const traverse require("babel/traverse").default; const generator require("babel/generator").default;// 1.定义要处理的代码 const jscode function square(n) {return n * n; };// 2.使用ba…

逻辑过期解决缓存击穿

我先说一下正常的业务流程&#xff1a;需要查询店铺数据&#xff0c;我们会先从redis中查询&#xff0c;判断是否能命中&#xff0c;若命中说明redis中有需要的数据就直接返回&#xff1b;没有命中就需要去mysql数据库查询&#xff0c;在数据库中查到了就返回数据并把该数据存入…

恢复误删和格式化的文件的利器

一、简介 1、一款由Piriform开发的免费文件恢复工具,它能够帮助用户恢复那些不小心从电脑上删除的文件,包括从回收站清空的文件,以及因用户错误操作而从存储设备中删除的图片、音乐、文档等多种格式的文件。Recuva支持对硬盘、闪存卡、U盘等多种存储介质进行扫描与恢复,并且…

CodeMeter助力Hilscher,推动实现全球智能制造连接解决方案

Hilscher的旗舰店为开放工业4.0联盟&#xff08;OI4&#xff09;社区提供了应用商店的便捷和开放性&#xff0c;将这一概念引入工业领域。该商店依托CodeMeter的许可证管理和加密保护&#xff0c;为工业用户提供了丰富的应用和解决方案库&#xff0c;满足他们在车间自动化和连接…

【问题分析】WMS无焦点窗口的ANR问题 + transientLaunch介绍【Android 14】

问题描述 Monkey跑出的Camera发生ANR的问题&#xff0c;其实跟Camera无关&#xff0c;任意一个App都会在此场景下发生ANR&#xff0c;场景涉及到Launcher的RecentsActivity界面&#xff0c;和transientLaunch相关。 1 log分析 看问题发生的场景&#xff1a; 1、Camera App的…

python基础实例

下一个更大的数 定义一个Solution类&#xff0c;用于实现next_great方法 class Solution: def next_great(self, nums1, nums2): # 初始化一个空字典answer&#xff0c;用于存储答案 answer {} # 初始化一个空列表stack&#xff0c;用于存储待比较的数字 stack [] # 遍历nu…

RK3568技术笔记之三 SAIL-RK3568开发板板卡功能测试

从这里开始&#xff0c;就是老生常谈系列之一&#xff1a;板卡功能测试。 放一张图镇一下帖 按照我自己顺手的方式&#xff0c;把这板子功能测一下。 先把开发板串口信息打印出来。 工具 功能 备注 电脑&#xff08;必备&#xff09; 提供使用终端软件环境 需要具备至少…

《精通ChatGPT:从入门到大师的Prompt指南》第1章:认识ChatGPT

第1章&#xff1a;认识ChatGPT 1.1 ChatGPT是什么 ChatGPT&#xff0c;全称为Chat Generative Pre-trained Transformer&#xff0c;是由OpenAI开发的一种先进的自然语言处理模型。它利用了深度学习中的一种技术——Transformer架构&#xff0c;来生成类人文本。ChatGPT通过对…