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

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

给你一个n x n的方形整数数组matrix,请你找出并返回通过matrix的下降路径的最小和。下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置(row, col)的下一个元素应当是(row + 1, col - 1)、(row + 1, col)或者(row + 1, col + 1)。

  1. 输入:matrix = [[2,1,3],[6,5,4],[7,8,9]],输出:13,解释:如图所示,为和最小的两条下降路径。
  2. 输入:matrix = [[-19,57],[-40,-5]],输出:-59,解释:如图所示,为和最小的下降路径。

提示:n == matrix.length == matrix[i].length;1 <= n <= 100;-100 <= matrix[i][j] <= 100。


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

确定状态表示:根据经验和题目要求,我们用dp[i][j]表示:到达[i, j]位置时,所有下降路径的最小和

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

  • 先到达[i - 1, j - 1]位置,再下降到[i, j]位置。此时,到达[i, j]位置的最小和,应该为到达[i - 1, j - 1]位置的最小和加上矩阵中[i, j]位置的元素,也就是dp[i - 1][j - 1] + matrix[i][j]。
  • 先到达[i - 1, j]位置,再下降到[i, j]位置。此时,到达[i, j]位置的最小和,应该为到达[i - 1, j]位置的最小和加上矩阵中[i, j]位置的元素,也就是dp[i - 1][j] + matrix[i][j]。
  • 先到达[i - 1, j + 1]位置,再下降到[i, j]位置。此时,到达[i, j]位置的最小和,应该为到达[i - 1, j + 1]位置的最小和加上矩阵中[i, j]位置的元素,也就是dp[i - 1][j + 1] + matrix[i][j]。

而到达[i, j]位置的最小和,应该是上面三种情况的最小值,即dp[i][j] = min(dp[i - 1][j - 1] + matrix[i][j], dp[i - 1][j] + matrix[i][j], dp[i - 1][j + 1] + matrix[i][j]) = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i - 1][j + 1]) + matrix[i][j]

初始化:根据状态转移方程,我们发现,在填写dp表的最上面一行、最左边一列和最右边一列时,会有越界访问。理论上,我们要对其进行初始化。这里我们采用增加辅助结点的方式来初始化。我们在dp表的最上面、最左边和最右边分别加上一行两列。接下来,我们要考虑,如何初始化辅助结点,才能让后续的填表是正确的。

观察状态转移方程,我们发现有一项是min(dp[i - 1][j - 1], dp[i - 1][j], dp[i - 1][j + 1]),用文字来表述,就是dp表中,该位置上面3个位置的最小值。再来分析一下,如果没有辅助结点,dp表第一行的值就应该是矩阵对应位置的值。现在有了辅助结点,只需要使min(dp[i - 1][j - 1], dp[i - 1][j], dp[i - 1][j + 1])这一项是0,就能符合预期。所以,最上面一行辅助结点就应该填充0。我们把目前已知的dp表画出来:

0 0 0 0 0
* ? ? ? *
* ?   ? *
* ?   ? *

此时只需要考虑*位置的辅助结点应该如何填写。现在最上面一行?位置的值已经是正确的了,只需要保证最左边和最右边两列的?位置的值也是正确的。再来观察状态转移方程,我们发现,影响结果的一项依然是min(dp[i - 1][j - 1], dp[i - 1][j], dp[i - 1][j + 1]),其中dp[i - 1][j - 1]和dp[i - 1][j + 1]会涉及到辅助结点。所以,为了使得求最小值时,辅助结点的值不会影响结果,应该将其初始化为+∞。dp表中*位置的辅助结点,也就是最左边和最右边两列,除了最上面一行的0以外,都要初始化为+∞。由于辅助结点的值并没有容易造成溢出风险的运算,所以将其设为INT_MAX就行了。

综上所述:我们在最上面、最左边和最右边分别增加一行两列辅助结点,并把最上面一行辅助结点初始化为0,把最左边和最右边两列辅助结点中,除了最上面一行之外,都初始化为INT_MAX

填表顺序:观察状态转移方程,dp表每个位置的值都依赖于上面3个位置的值,所以应从上往下填表,至于左右顺序无所谓,这里选择从左往右填表。

返回值:由于要返回的是所有下降路径的最小和,我们并不知道最终会下降到最下面一行的哪个位置,再根据状态表示,我们应该返回的是dp表最下面一行中,除了最左边和最右边的2个元素之外,其他元素的最小值(事实上,把最左边和最右边的2个元素考虑进去也没什么问题,毕竟INT_MAX不会影响求最小值的结果)。

细节问题:由于新增了一行两列辅助结点,所有dp表的规模会比矩阵多一行两列。题目描述中,矩阵是方形的,假设其规模是n x n,那么dp表的规模就是(n + 1) x (n + 2)。另外,由于新增了辅助结点,需要时刻注意下标的映射关系:dp表的[i, j]位置对应矩阵的[i - 1, j - 1]位置

时间复杂度:O(N^2),空间复杂度:O(N^2)。

class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {size_t n = matrix.size();// 创建dp表vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX));// 初始化fill(dp[0].begin(), dp[0].end(), 0);// 填表for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {dp[i][j] =min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i - 1][j + 1])) +matrix[i - 1][j - 1];}}// 返回结果return *min_element(dp[n].begin() + 1, dp[n].end() - 1);}
};

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

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

相关文章

【Altium】AD-原理图中使用多通道问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决在原理图主图中&#xff0c;对子图使用多通道命令后&#xff0c;子图未形成多个通道的问题。 2、 问题场景 客户手中的工程文件&#xff0c;主图中对子图使用了多通道命令&#xff0c;子图图纸并未形成多通道…

【全开源】废品回收垃圾回收小程序APP公众号源码PHP版本

&#x1f31f;废品回收小程序&#xff1a;绿色生活的新助手&#x1f331; 一、引言 随着环保意识的逐渐提高&#xff0c;废品回收成为了我们日常生活中的重要一环。但是&#xff0c;如何更方便、高效地进行废品回收呢&#xff1f;今天&#xff0c;我要向大家推荐一款超级实用…

flutter封装日历选择器(单日选择)

简单封装&#xff1a; 引入库&#xff1a;table_calendar import package:generated/l10n.dart; import package:jade/utils/JadeColors.dart; import package:jade/utils/Utils.dart; import package:util/easy_loading_util.dart; import package:flutter/material.dart; im…

搭建Java Spring Boot工程的步骤

搭建Java Spring Boot工程的步骤如下&#xff1a; 确保你已经安装了Java开发工具包&#xff08;JDK&#xff09;和Maven构建工具。如果没有安装&#xff0c;请先安装。&#xff08;见文章&#xff1a;安装Maven构建工具步骤-CSDN博客&#xff09; 打开命令行工具或终端窗口&am…

leetcode 2938.区分白球与黑球

leetcode 2938.区分白球与黑球&#xff08;传送门&#xff09; 思路&#xff1a;把1放右边&#xff0c;0放左边&#xff0c;只要把0全部放好那么1肯定也全部放好了。考虑将靠左的0放在靠左的位置&#xff0c;也就是第i个0要放到下标为i-1的位置&#xff0c;所以直接遍历并更新…

HTML跨年烟花

目录 写在前面 关于小编 HTML简介 程序设计 系列文章 写在后面 写在前面 学会了这个html烟花秀&#xff0c;跨年就不缺文案喽~ 关于小编 平易近人&#xff0c;慈眉善目&#xff0c;爱交朋友&#xff0c;舍己为人&#xff0c;和蔼可亲&#xff0c;能说会道&#xff0c;…

24上半年报考人数“不增反降”?备考下半年软考的难了......

近日&#xff0c;工信教考发布了一篇《2024年上半年计算机软件资格考试顺利举行》的文章&#xff0c;公布了2024年上半年软考报考人数共计52.77万人&#xff0c;其中&#xff0c;初级资格5.12万人、中级资格24.37万人、高级资格23.28万人。 软考高级占总报名人数的44%&#xf…

Linux网络编程:回顾网络通信

1.数据从应用层到数据链路层的本质 数据的封装&#xff1a; 用户在用户级缓冲区输入数据&#xff0c;经过应用层协议进行序列化成字节流数据&#xff0c;拷贝到传输层的缓冲区。而操作系统在传输层维护了sk_buff这一个结构体&#xff0c;然后data指针指向这段数据的开头&#x…

api网关kong对高频的慢接口进行熔断

一、背景 在生产环境&#xff0c;后端服务的接口响应非常慢&#xff0c;是因为数据库未创建索引导致。 如果QPS低的时候&#xff0c;因为后端服务有6个高配置的节点&#xff0c;虽然接口慢&#xff0c;还未影响到服务的正常运行。 但是&#xff0c;当QPS很高的时候&#xff0c…

基于STM32的毕业设计示例

**基于STM32的毕业设计示例** 一、引言 在当前的电子工程领域&#xff0c;STM32微控制器因其高性能、低功耗和丰富的外设接口而备受青睐。本次毕业设计旨在展示基于STM32微控制器的系统设计与实现能力&#xff0c;通过构建一个具有实际应用价值的系统&#xff0c;体现对嵌入式…

vue3 递归循环展示下级盒子

index.vue主文件 <template><div><RecursiveCard :data"rootTask" /></div> </template><script> import { reactive } from vue; import RecursiveCard from ./test.vue; // 递归组件的路径export default {components: {Recu…

广东智慧物流2024年端午节放假安排

广东智慧物流2024年端午节放假安排

使用HTML、CSS和JavaScript编写一个注册界面(一)

倘若文章或代码中有任何错误或疑惑&#xff0c;欢迎提出交流哦~ HTML和CSS 首先&#xff0c;我们需要编写一个简洁的注册界面。 简单编写下&#xff0c;如下&#xff1a; 呈现效果为&#xff1a; <!DOCTYPE html> <html lang"en"><head><me…

从普通篮球场到高端气膜馆:全新运动体验的打造—轻空间

在现代体育设施的发展中&#xff0c;气膜馆以其独特的优势和创新设计&#xff0c;正在改变我们对运动场所的传统认知。将一片普通的篮球场转变为高逼格的气膜馆&#xff0c;不仅可行&#xff0c;而且能提供极大的便利和众多的好处&#xff0c;让运动体验更上一层楼。 气膜馆的优…

巨详细Linux卸载Redis教程

巨详细Linux卸载Redis教程 1、检查系统残留redis数据2、卸载系统残留redis数据 1、检查系统残留redis数据 redis等数据相关中间件安装前一定要进行残留数据检查&#xff0c;排除后期存在的各种隐患。 #检查有没有残留客户端 whereis redis-cli #检查有没有残留服务 whereis r…

Git 版本控制系统详解

目录 Git 版本控制系统详解一、Git 的作用1. 版本控制2. 分支管理3. 分布式开发4. 协作开发 二、Git 的安装和基本使用1. 安装 Git1.1 Windows1.2 macOS1.3 Linux 2. 配置 Git3. 创建和克隆仓库3.1 创建本地仓库3.2 克隆远程仓库 4. 基本操作4.1 添加文件到暂存区4.2 提交更改4…

开发项目功能开发设计模板

功能开发设计是一个系统化的过程&#xff0c;旨在确保新功能的开发既满足用户需求又符合技术标准。以下是一个适用于大多数软件开发项目功能开发设计模板&#xff1a;

94、python-第三阶段-4-数据计算-map方法

直接运行会报错&#xff0c;需要配置下python环境变量 from pyspark import SparkConf,SparkContext import os os.environ[PYSPARK_PYTHON]"D:/Program Files/Python/Python3.13/python.exe" conf SparkConf().setMaster("local[*]").setAppName("…

python安装Django

转国内源 添加链接描述 安装 pip install setuptools安装Django 添加链接描述 pip install django3.2 查看版本 python -m django --version 我的django安装路径&#xff1a;安装python的路径 C:\Program Files\Python38\Lib\site-packages\django\bin 配置django环境变量…

邦芒支招:4招减轻工作压力让你工作更轻松

​​“弱肉强食&#xff0c;适者生存”&#xff0c;这是现代社会唯一的生存法则。就拿公司而言&#xff0c;可能昨天还市值几百亿&#xff0c;今天就能宣告破产。而身在职场的你&#xff0c;也不得不时时刻刻绷着一根弦&#xff0c;不然就有可能被淘汰&#xff0c;每个职场人都…