动态规划——路径问题:931.下降路径最小和

文章目录

  • 题目描述
  • 算法原理
    • 1.状态表示(经验+题目)
    • 2.状态转移方程
    • 3.初始化
    • 4.填表顺序
    • 5.返回值
  • 代码实现
    • C++
    • Java

题目描述

题目链接:931.下降路径最小和
在这里插入图片描述
关于这⼀类题,看过我之前的博客的朋友对于状态表示以及状态转移是⽐较容易分析出来的。比较难的地方可能就是对于边界条件的处理。

算法原理

1.状态表示(经验+题目)

对于这种路径类的问题,我们的状态表示⼀般有两种形式:

  • 从 [i, j] 位置出发,到达⽬标位置有多少种方式;
  • 从起始位置出发,到达 [i, j] 位置,⼀共有多少种方式。

这⾥选择第⼆种定义状态表示的方式:
dp[i][j] 表示:到达 [i, j] 位置时,所有下降路径中的最小和。

2.状态转移方程

在这里插入图片描述

根据最近的一步划分问题。对于普遍位置 [i, j] ,根据题意得,到达 [i, j] 位置可能有三种情况:

  • 从正上方 [i - 1, j] 位置转移到 [i, j] 位置;
  • 从左上方 [i - 1, j - 1] 位置转移到 [i, j] 位置;
  • 从右上方 [i - 1, j + 1] 位置转移到 [i, j] 位置;

我们要的是三种情况下的最小值,然后再加上矩阵在 [i, j] 位置的值。
所以得出状态转移方程:

dp[i][j] = min(dp[i - 1][j], min(dp[i - 1][j - 1], dp[i - 1][j + 
1])) + matrix[i - 1][j - 1]

3.初始化

在这里插入图片描述

可以在最前面加上⼀个辅助结点,帮助我们初始化。使用这种技巧要注意两个点:

  • 辅助结点里面的值要保证后续填表是正确的
  • 下标的映射关系

在本题中,需要加上一行,并且加上两列。所有的位置都初始化为INT_MAX,然后将第⼀行初始化为 0 即可。

4.填表顺序

根据状态表示,填表的顺序是从上往下即可,同一行的顺序可以随意。

5.返回值

注意这⾥不是返回 dp[m][n] 的值!题⽬要求只要到达最后一行就行了,因此这⾥应该返回 dp 表中最后一行的最小值

代码实现

C++

class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {//1.创建一个dp表int n = matrix.size();vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX));//2.初始化for(int k = 0;k <= n + 1;++k)dp[0][k] = 0;//3.填表for(int i = 1;i <= n;++i)for(int j = 1;j <= n;++j)dp[i][j] = min(min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i - 1][j + 1]) + matrix[i - 1][j - 1];//这边要注意一下下标的映射关系//4.返回值int ret = INT_MAX;for(int m = 1;m <= n;++m)ret = min(ret, dp[n][m]);return ret;}
};

Java

class Solution {public int minFallingPathSum(int[][] matrix) {// 1. 创建 dp 表// 2. 初始化// 3. 填表// 4. 返回结果int n = matrix.length;int[][] dp = new int[n + 1][n + 2];for (int i = 1; i <= n; i++)dp[i][0] = dp[i][n + 1] = Integer.MAX_VALUE;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i - 1][j - 1],dp[i - 1][j + 1])) + matrix[i - 1][j - 1];int ret = Integer.MAX_VALUE;for (int j = 1; j <= n; j++)ret = Math.min(ret, dp[n][j]);return ret;}
}

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

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

相关文章

【CSS】认识CSS选择器及各选择器对应的用法

目录 一、什么是CSS&#xff1f; 二、CSS 选择器 1. 标签选择器 2. 类选择器 3. ID选择器 4. 通配符选择器 5. 复合选择器 一、什么是CSS&#xff1f; CSS(Cascading Style Sheet)&#xff0c;层叠样式表。它与 HTML&#xff08;超文本标记语言&#xff09;一起使用&am…

redis--安装

简介 官网&#xff1a;RedisInsight - The Best Redis GUI 各个版本官网下载地址&#xff1a;http://download.redis.io/releases/ Redis和Memcached是非关系型数据库也称为NoSQL数据库&#xff0c;MySQL、Mariadb、SQL Server、PostgreSQL Oracle 数据库属于关系型数据 应用…

[C++初阶]string的几道oj题

1.LCR 192. 把字符串转换成整数 (atoi) 这题难度不大,我这里采取遍历跳过空格的方式&#xff0c;我先展示出我的代码,然后慢慢讲解: class Solution { public:int myAtoi(string str) {if (str.empty()) return 0;int lengthstr.size();int i0;int symbol1;int sum0;while(i&l…

Apple强大功能:在新款 iPad Pro 和 iPad Air 中释放 M4 芯片潜力

Apple 的最新强大功能&#xff1a;在新款 iPad Pro 和 iPad Air 中释放 M4 芯片的潜力 概述 Apple 推出配备强大 M4 芯片的最新 iPad Pro 和 iPad Air 型号&#xff0c;再次突破创新界限。新一代 iPad 有望彻底改变我们的工作、创造和娱乐方式。凭借无与伦比的处理能力、令人惊…

QX-mini51单片机学习-----(3)流水灯

目录 1宏定义 2函数的定义 3延时函数 4标准库函数中的循环移位函数 5循环移位函数与左移和右移运算符的区别 6实例 7keil中DeBug的用法 1宏定义 是预处理语句不需要分号 #define uchar unsigned char//此时uchar代替unsigned char typedef是关键字 后面是接分号…

【maven】有些依赖的私有但构建老拉取远程库异常

有时候需要远程依赖包&#xff0c;但是私有包是传统的相互传递的&#xff0c;那么偏偏又去拉远程就会异常&#xff0c;所有进行操作如下

4.用python爬取保存在text中的格式为m3u8的视频

文章目录 一、爬取过程详解1.寻找视频的m3u8链接2.从网页源码中寻找视频的m3u8链接的第二部分内容3.从视频的m3u8链接获取视频 二、完整的代码 一、爬取过程详解 1.寻找视频的m3u8链接 这个文档承接了爬虫专栏的 第一节.python爬虫爬取视频网站的视频可下载的源url&#xff0…

springboot整合rabbitmq的不同工作模式详解

前提是已经安装并启动了rabbitmq&#xff0c;并且项目已经引入rabbitmq&#xff0c;完成了配置。 不同模式所需参数不同&#xff0c;生产者可以根据参数不同使用重载的convertAndSend方法。而消费者均是直接监听某个队列。 不同的交换机是实现不同工作模式的关键组件.每种交换…

智能家居4 -- 添加接收消息的初步处理

这一模块的思路和前面的语言控制模块很相似&#xff0c;差别只是调用TCP 去控制 废话少说&#xff0c;放码过来 增添/修改代码 receive_interface.c #include <pthread.h> #include <mqueue.h> #include <string.h> #include <errno.h> #include <…

李廉洋:5.8黄金原油多次小跌,今日必看独家策略。

黄金消息面分析&#xff1a;联储卡什卡利表示&#xff0c;需要更多的数据才能知道通胀回到2%目标的进展是否已经停滞&#xff0c;现在就宣布肯定已经停滞不前还为时过早。卡什卡利说&#xff1a;“我们现在的情况很好&#xff0c;劳动力市场依然强劲&#xff0c;我们可以慢慢获…

【实验3.1]使用Scrapy采集豆瓣读书评分在9分以上的图书数据。 要求采集每本图书的数据,包括图书名、评分、作者、出版社和出版年份。

目录 1.项目代码如图所示&#xff1a; 2.代码详情 __init__.py dbbook.py __init__.py items.py pipelines.py setting.py main.py scrapy.cfg 4.实验前准备&#xff1a; 1.项目代码如图所示&#xff1a; 2.代码详情 __init__.py # This package will contain the…

remmina无法连接远程桌面,Remmina无法连接远程桌面的原因与解决办法

在解决Remmina无法连接远程桌面的问题时&#xff0c;我们需要考虑多种可能的原因&#xff0c;并采取相应的解决办法。以下是一些常见的原因及其对应的解决方案&#xff1a; 1、网络问题 原因&#xff1a;不稳定的网络连接或中断可能导致无法建立远程桌面连接。 解决办法&#x…