动态规划|【路径问题】|931.下降路径最小和

目录

题目

题目解析

思路

1.状态表示

2.状态转移方程

3.初始化

4.填表顺序

5.返回值

代码


题目

931. 下降路径最小和

给你一个 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

题目解析

        题目是给一个n*n的矩阵,矩阵里面有值,从第一行到最后一行,所走过的最小值,从第一行元素的任意一个开始,往最后一行走 ,既然是最小值,那没每次就要挑下一行的最小值走,,而这个不是随便挑的,是以第一行这个位置,在第二行离的最近的三个位置中跳最小的值,图示如下图。

        如果第一行从1开始走,那么第二行,只能走6,5或者4。每走一步加上该位置的值就行,根据规则走到最后 一行 就算结束,返回最小的那个就行。如果是边界,也就是只有两个位置离它最近。

思路

1.状态表示

        状态表示,我们还是选用最常用的方法——选用以某一个位置为结尾,也就是从第一行走到该位置,题目要求,最小路径,所以状态表示可以看成dp[i][j]——从开始走到该【i,j】位置的最小的下降路径

2.状态转移方程

        根据最近的一步划分路径,最近的路径,到达【i,j】位置,可以从【i-1,j-1】位置,【i-1,j】或者【i-1,j+1】位置到达,所以应当分三种情况讨论。

a)从【i-1,j-1】位置到达【i,j】位置

        要得到第一行到【i,j】位置的最小路径,就要得到第一行到【i-1,j-1】的最小路径,然后加上【i-1,j-1】位置上面的值就是,第一行到【i,j】位置的最小值。而第一行到【i-1,j-1】位置的最小路径可以用dp[i-1][j-1]表示,

        所以此情况下的状态转移方程就是dp[i][j]=dp[i-1][j-1]+matrix[i-1][j-1]

b)从【i-1,j】位置到达【i,j】位置

        同理,得到这个状态转移方程dp[i][j]=dp[i-1][j]+matrix[i-1][j]

c)从【i-1,j+1】位置到达【i,j】位置

        同理,得到这个状态转移方程dp[i][j]=dp[i-1][j+1]+matrix[i-1][j+1]

然后取这三种情况的最小值。

3.初始化

        初始化是为了让填表的时候不要越界。我们要算第一行到指定位置的路径最小值,也就是算dp[i][j],根据状态转移方程可以看出要算dp[i][j],要先得到dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1],第一行和第一列和最后一列,这三个位置是不全的,所以要初始化第一行和第一列,最后一列的位置。

        之前学过,虚拟节点的方式,把需要的位置补起来,填上能使结果正确的值就行,补虚拟结点的方式,如下图所示。

        现在要确定里面要填什么值,才能使结果正确,我们先来看不加虚拟结点的时候那里面应该填什么?

        对于第一行,比如:dp[0][0],dp[0][0]表示从第一行到当前位置的最小值,可以看出当前位置就是在第一行,也就是自己到自己,也就等于本身矩阵里面的值,这样 我们将加的第一行虚拟结点赋值为0就可以不影响结果。

        对于第一列和最后一列,对于第一列,从第二行开始,它们只是缺了左上角那个数,其他两个都在,如果不加虚拟结点,也就是说只在这两个结点里面挑一个最小的加上就行,也就是说 虚拟结点里面的值不能影响dp[i][j]的结果 ,虚拟结点里面的值要比其他两个值都大,为了确保起见,应该将虚拟结点赋值为正的无穷大。

        我们加完之后,还要解决下标映射的问题加了一行,所以就 整体向下挪了一行,左边增加一列,也就是向右挪了一列。

        所以当我们算dp[1][1]的值我们要用martix[0][0]值来计算。

4.填表顺序

填表顺序,还是从上到下,从左到右

5.返回值

因为是要到达最后一行,并且是要最小值,所以我们返回dp表中最后一行的最小值就行

代码

        初始化技巧:我们为了方便初始化,如果我们在定义dp表时,将所有值定义为0,后面初始化的时候要改两列的值,所以这里可以我们一开始就将每个初始化正的无穷大。

int min(int a,int b)
{return (a<b)?a:b;
}
int minFallingPathSum(int** matrix, int matrixSize, int* matrixColSize)
{int nummin=INT_MAX;int n=matrixColSize[0];//创建一个dp表int dp[102][102]={INT_MAX};//初始化for(int i=0;i<102;i++)for(int j=0;j<102;j++){dp[i][j]=INT_MAX;}for(int j=0;j<n+2;j++)dp[0][j]=0;//填表 for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dp[i][j]=min(   min(dp[i-1][j],dp[i-1][j-1])  ,   dp[i-1][j+1]   )   +matrix[i-1][j-1];}}for(int j=1;j<=n;j++){nummin=min(nummin,dp[n][j]);}return nummin;
}

空间复杂度:O(n^{2})

时间复杂度:O(n^{2})

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

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

相关文章

力扣SQL50 大的国家 查询

Problem: 595. 大的国家 Code select name,population,area from World where area > 3000000 or population > 25000000;

Apache Echarts介绍与入门

介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网地址&#xff1a;https://echarts.apache.org/zh/index.html 入门案例 Apache Echarts官方提供的快…

三天学会阿里分布式事务框架Seata-seata事务分组介绍

锋哥原创的分布式事务框架Seata视频教程&#xff1a; 实战阿里分布式事务框架Seata视频教程&#xff08;无废话&#xff0c;通俗易懂版&#xff09;_哔哩哔哩_bilibili实战阿里分布式事务框架Seata视频教程&#xff08;无废话&#xff0c;通俗易懂版&#xff09;共计10条视频&…

linux系统Jenkins工具添加自由项目和maven项目

Jenkins添加自由项目 添加自由项目操作流程代码远程代码邮件标题邮件正文 添加maven项目准备环境操作流程 添加自由项目 gitlab配置基本代码页面等&#xff0c;拉取代码&#xff0c;打包&#xff0c;发布操作流程 代码 远程代码 echo ssh root192.168.188.177 "tar cz…

【OpenCV】绘制桌面锁屏时钟

OpenCV 是一个开源的计算机视觉&#xff08;Computer Vision&#xff09;与机器学习软件库&#xff0c;提供了多种图像处理算法与接口&#xff0c;用于解决计算机视觉相关问题。OpenCV 支持多平台与多语言&#xff0c;本文主要记录如何使用 OpenCV-Python 绘制桌面锁屏时钟。 目…

一起玩儿平衡车(ESP32)——02 平衡车的组装与接线方法

摘要&#xff1a;本文介绍平衡车的组装与接线方法 前边介绍了所要实现的平衡车的组成&#xff0c;接下来就来把小车组装起来。首先是下层底板的底面要固定两个轮子。这个只要固定孔位没有问题&#xff0c;用螺丝直接将轮子支架固定上去就可以了。固定好后如下图所示&#xff1…

【MySQL】:高效利用MySQL函数实用指南

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. MySQL函数概论二. 字符串函数三. 数值函数四. 日期函数五. 流程函数&#x1…

达梦数据库基础操作(三):表相关操作

达梦数据库基础操作(三)&#xff1a;表相关操作 1. 表相关操作 1.1 创建表 # 使用 CREATE TABLE 语句创建 employee 表。 CREATE TABLE employee (employee_id INTEGER,employee_name VARCHAR2(20) NOT NULL,hire_date DATE,salary INTEGER,department_id INTEGER NOT NULL )…

会声会影使用教程:5分钟学会会声会影

工具材料&#xff1a; 工具材料&#xff1a; 会声会影软件 会声会影2023下载地址 https://souurl.cn/gbXy1d 会声会影2022下载地址 https://souurl.cn/2KpINh 会声会影2021下载地址 https://souurl.cn/jd1HOr 会声会影2020下载地址 https://souurl.cn/3EJxdZ 使用方法&am…

搭建stressapptest调试环境:VSCode的分步教程

vscode调试stressapptest详解 一、环境准备二、设置调试配置2.1、编辑launch.json文件和task.json文件2.2、将 stressapptest 编译成 debug 版本 三、运行调试总结 一、环境准备 stressapptest&#xff08;简称SAT&#xff09;是一种用于在Linux系统上测试系统稳定性和可靠性的…

CryoEM - 使用 cryoSPARC 基于单颗粒图像从头重构蛋白质三维结构

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136384544 基于冷冻电镜单颗粒图像重构蛋白质三维结构,利用冷冻电镜技术测定生物大分子结构的方法。原理是从冷冻电镜获得大量同一种蛋白质分子的二维投影图…

03按键控制LED

上回讲到点亮一个LED     这次我们来实现用按键控制led 不带中断的方式 当然实例来源网络 加上自己整合 先熟悉流程 0.添加一个自己写的驱动库文件 为什么添加 笔者想的是一个项目工程希望能适应很多个应用场景需要什么直接在里面调用分装好的函数就行 1.如何添加文件以及…