动态规划|【路径问题】|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})

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

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

相关文章

基于devfreq framework的GPU调频

AI时代已经来临&#xff0c;在日益增长的算力需求下&#xff0c;GPU已经成为AI世界不可或缺的工具&#xff0c;而移动端高渲染高帧应用也对移动端GPU提出越来越高的要求&#xff0c;本文将以高通的adreno gpu为例对GPU的调频进行介绍。 在介绍之前&#xff0c;建议先阅读本文章…

2024年腾讯云新用户和老用户优惠代金券免费领取,共14张代金券

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

电子科技大学《数据库原理及应用》(持续更新)

前言 电子科技大学的数据库课程缩减了部分的课时&#xff0c;因此&#xff0c;可能并不适合所有要学习数据库的宝子们&#xff0c;但是&#xff0c;本人尽量将所有数据库的内容写出来。本文章适用于本科生的期中和期末的复习&#xff0c;电子科技大学的考生请在复习前先看必读…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:位置设置)

设置组件的对齐方式、布局方向和显示位置。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 align align(value: Alignment) 设置容器元素绘制区域内的子元素的对齐方式。 卡片能力&#xff1a; 从API…

代码随想录第二十五天 78.子集 90.子集II 491.非递减子序列

LeetCode 78 子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…

【Spring】spring中怎么解决循环依赖的问题

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Spring ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 解决步骤 考虑 结语 我的其他博客 前言 在软件开发中&#xff0c;依赖注入是一种常见的设计模式&#xff0c;它可以帮助我们管…

SQL Server 开发环境配置教程(SSMS+SQL Prompt)

背景 记录一下 SQL Server 常用开发软件 体验了各种数据库IDE(DBeaver、Navicat、DataGrip)之后综合下来还是感觉 SSMSSQL Prompt 对于 SQL Server 最好用&#xff0c;所以在此记录一下配置过程 数据库可视化管理工具SSMS 官方下载地址&#xff1a; https://learn.microsoft…

设计模式-结构模式-装饰模式

装饰模式&#xff08;Decorator Pattern&#xff09;&#xff1a;动态地给一个对象增加一些额外的职责&#xff0c;就增加对象功能来说&#xff0c;装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。 //首先&#xff0c;定义一个组件接口&#xff1a; public in…

简单求和计算器

其实对于计算器的写法在C语言阶段就已经有了&#xff0c;但是&#xff0c;在目前阶段《前后端交互》&#xff0c;这算是一种全新的写法&#xff0c;毕竟将数据从前端返回给后端&#xff0c;然后再将数据返回给前端&#xff0c;都涉及到一些参数的交互&#xff0c;值得我们学习深…

qt5-入门-使用拖动方式创建Dialog

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 目录 实现效果基本流程逐步实操1&#xff09;创建和初始化子部件2&#xff09;把子部件放进布局中3&#xff09;设置tab顺序4&#xff09…

LeetCode:2368. 受限条件下可到达节点的数目(dfs Java)

目录 2368. 受限条件下可到达节点的数目 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 2368. 受限条件下可到达节点的数目 题目描述&#xff1a; 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - …

【python】python懂车帝数据可视化(代码+报告)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

select,poll和epoll有什么区别

它们都是NIO中多路复用的三种实现机制&#xff0c;是由linux操作系统提供的。 用户空间和内核空间&#xff1a;操作系统为了保证系统安全&#xff0c;将内核分为两个部分&#xff0c;一个是用户空间&#xff0c;一个是内核空间。用户空间不能直接访问底层的硬件设备&#xff0…

qt 5.15版本安装

1.qt5.15版本安装 2.安装慢时&#xff0c;切换到清华镜像源&#xff1a;.\qt-unified-windows-x64-online.exe --mirror https://mirrors.tuna.tsinghua.edu.cn/qt/ 3.没有qt 5.15版本在旁边进行筛选&#xff0c;只选archive

【多线程】CAS详解

目录 &#x1f334;什么是 CAS&#x1f338;CAS 伪代码 &#x1f38d;CAS 是怎么实现的&#x1f340;CAS 有哪些应⽤&#x1f338;实现原子类&#x1f338;实现自旋锁 &#x1f333;CAS 的 ABA 问题&#x1f338;**什么是 ABA 问题**&#xff1f;&#x1f338;ABA 问题引来的 B…

你心中的韩剧TOP1是哪一部

关注公众号&#xff1a;萌番bilfun&#xff0c;发送影片名称&#xff0c;即可获取资源链接 【2024最新韩剧来袭&#xff0c;准备好迎接心灵的震撼了吗&#xff1f;】 韩剧迷们&#xff0c;你们期待已久的2024最新韩剧终于来了&#xff01;准备好迎接心灵的震撼了吗&#xff1f…

【嵌入式学习】网络编程day03.02

一、项目 1、TCP机械臂测试 #include <myhead.h> #define SER_IP "192.168.126.32" #define SER_PORT 8888 #define CER_IP "192.168.126.42" #define CER_PORT 9891 int main(int argc, const char *argv[]) {int wfd-1;//创建套接字if((wfdsocke…

【PyTorch】成功解决AttributeError: ‘Tuple‘ object has no attribute ‘cuda‘

【PyTorch】成功解决AttributeError: ‘Tuple‘ object has no attribute ‘cuda‘ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

Vue.js大师: 构建动态Web应用的全面指南

VUE ECMAScript介绍什么是ECMAScriptECMAScript 和 JavaScript 的关系ECMAScript 6 简介 ES6新特性let基本使用const不定参数箭头函数对象简写模块化导出导入a.jsb.jsmain.js Vue简介MVVM 模式的实现者——双向数据绑定模式 Vue环境搭建在页面引入vue的js文件即可。创建div元素…

分享Selenium测试工具用来模拟用户浏览器的操作

执行JS的类库&#xff1a;execjs&#xff0c;PyV8&#xff0c;selenium&#xff0c;node pip list pip install selenium pip install xlrd pip install xlwt pip install PyExecJS pip install xlutils selenium测试工具可以用来模拟用户浏览器的操作&#xff0c;其支持的浏览…