LeetCode·每日一题·931. 下降路径最小和·记忆化搜索

news2024/11/20 9:29:46

作者:小迅
链接:https://leetcode.cn/problems/minimum-falling-path-sum/solutions/2341965/ji-yi-hua-sou-suo-zhu-shi-chao-ji-xiang-3n58v/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目

 

示例

 

思路

题意 -> 给定一个二维数组,返回从第一行到最后一行路径和最小值

简单直接的做法是将所有路径和都求出来,然后从所有路径和中寻找最小值返回。

使用递归即可解决上述问题,就是一个深度优先搜索过程,对于每一个位置都有三种下一步方法,每次取三种方法中最小值返回,从下往上筛选最小值,最后返回值肯定是最小值。枚举所有起始位置,取最小值即可。

int dfs(int **matrix, int n, int m, int i, int j)
{
    if (j < 0 || j >= m) return INT_MAX;
    if (i == n-1) return  matrix[i][j];
    int left = INT_MAX, mid = INT_MAX, right = INT_MAX;
    left = dfs(matrix, n, m, i + 1, j - 1);
    mid = dfs(matrix, n, m, i + 1, j);
    right = dfs(matrix, n, m, i + 1, j + 1);
    return fmin(fmin(left, mid), right) + matrix[i][j];
}

对于不同的起始位置,中间路程却存在很多相同的地方,而上述方法中对于中间重复地方还是会递归枚举,存在很多重复计算,可以使用数组对走过的路径进行记录,当下次在到当前位置时直接返回数组记录的值,上述方法就为 记忆化搜索。

代码注释超级详细

代码


int dfs(int **matrix, int n, int m, int i, int j, int (*ans)[m])
{
    if (j < 0 || j >= m) return INT_MAX;//越界无效值
    if (ans[i][j] != INT_MAX) return ans[i][j];//重复路径
    if (i == n-1) return matrix[i][j];//底部返回
    int left = INT_MAX, mid = INT_MAX, right = INT_MAX;
    left = dfs(matrix, n, m, i + 1, j - 1, ans);//左边路径
    mid = dfs(matrix, n, m, i + 1, j,  ans);//中间路径
    right = dfs(matrix, n, m, i + 1, j + 1, ans);//右边路径
    //保存当前位置路径最小值,记忆化保存
    ans[i][j] = fmin(fmin(left, mid), right) + matrix[i][j];
    return  ans[i][j];
}
int minFallingPathSum(int** matrix, int matrixSize, int* matrixColSize){
    int min = INT_MAX;
    int n = matrixSize, m = matrixColSize[0];
    int ans[n][m];
    for (int i = 0; i < n; ++i) {//记忆化数组初始化
        for (int j = 0; j < m; ++j) {
            ans[i][j] = INT_MAX;
        }
    } 
    for (int i = 0; i < m; ++i) {//枚举每一个起点位置
        int sum = dfs(matrix, n, m, 0, i, ans);
        min = fmin(min, sum);//保存最小值路径
    }
    return min;
}

作者:小迅
链接:https://leetcode.cn/problems/minimum-falling-path-sum/solutions/2341965/ji-yi-hua-sou-suo-zhu-shi-chao-ji-xiang-3n58v/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

Mysql单表多表查询练习

题目要求&#xff1a; 1.查询student表的所有记录 2.查询student表的第2到4条记录 3.从student表查询所有的学生的学号&#xff08;id&#xff09;&#xff0c;姓名&#xff08;name&#xff09;&#xff0c;和院系&#xff08;department&#xff09;的信息 4.从student表…

LeetCode 75 第一题(1768)交替合并字符串

题目: 示例: 分析: 这是LeetCode75 的第一道题目,是一道简单题,题目没那么复杂,就是给两个字符串,要这两个字符串你出一个字符我出一个字符来拼凑出一个新的字符串,如果其中一个字符串用完了则剩下部分全部由另一个字符串出. 我们可以使用两个指针分别指向word1和word2: str…

【hadoop】部署hadoop全分布模式

hadoop全分布模式 全分布模式特点部署全分布模式准备工作正式配置hadoop-env.shhdfs-site.xmlcore-site.xmlmapred-site.xmlyarn-site.xmlslaves对NameNode进行格式化复制到另外两台虚拟机启动 对部署是否成功进行测试 全分布模式特点 真正的分布式环境&#xff0c;用于生产具…

【动手学习深度学习--逐行代码解析合集】19含并行连结的网络(GoogleNet)

【动手学习深度学习】逐行代码解析合集 19含并行连结的网络&#xff08;GoogleNet&#xff09; 视频链接&#xff1a;动手学习深度学习–含并行连结的网络&#xff08;GoogleNet&#xff09; 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v…

H3C-Cloud Lab实验-三层交换机实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1. 按照图示为 PC2 和 PC3 配置 IP 地址和网关 2. PC2 属于 Vlan10&#xff0c;PC3 属于 Vlan20&#xff0c;在三层交换机上配置 Vlanif 三层接口实现 Vlan10 和 Vlan20 三层互通 3. PC2 和 PC3 可以互通 实验步骤&#xff1a…

WAIC2023| AIGC究竟在向善还是向恶而行?

目录 一、常见图像篡改技术二、传统篡改图像检测方法2.1、基于光源和噪声的拼接图像篡改检测方法2.2、基于马尔科夫特征的检测方法 三、基于深度学习的图像篡改检测方法3.1、基于Fisher编码和SVM模型的方法3.2、 基于局部异常特征检测的Mantra-Net方法3.2、基于HRNet的编码器—…

Flink是什么

先看下大数据的发展历程 随着公司业务的增加&#xff0c;各种场景都要大量的业务数据产生&#xff0c;对于这些不断产生的数据如何进行有效的处理&#xff1f; 由此诞生了大数据处理工具&#xff1a; 数据存在关系型数据库&#xff0c;比如mysql&#xff0c;如何分析数据&#…

css之混合模式、文字智能适配背景、文字镂空效果、差值模式、滤色模式、difference、screen、overlay、mix、blend、mode

文章目录 文字智能适配背景(差值模式)文字镂空效果(滤色模式)文字与背景叠加(叠加模式)css3混合模式mix-blend-mode功能表格混合模式的分类 文字智能适配背景(差值模式) <div class"main"><span>文字智能适配背景</span> </div>.main {widt…

【python】python手机评论抓取+情感分析(python代码+报告)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、51CTO技术博主 &#x…

1.8 运用C编写ShellCode代码

在笔者前几篇文章中&#xff0c;我们使用汇编语言并通过自定位的方法实现了一个简单的MessageBox弹窗功能&#xff0c;但由于汇编语言过于繁琐在编写效率上不仅要考验开发者的底层功底&#xff0c;还需要写出更多的指令集&#xff0c;这对于普通人来说是非常困难的&#xff0c;…

Linux —— 进程介绍

目录 一&#xff0c;进程介绍 二&#xff0c;进程使用 进程查看 通过系统调用获取进程标识符 通过系统调用创建进程 fork 一&#xff0c;进程介绍 进程是正在执行的程序或命令&#xff0c;每个进程都是一个运行的实体或程序的执行实例&#xff0c;有自己的地址空间&#x…

RNA病毒基因组的重头组装-内含tophat2报错的快速解决办法-CPIV3数据分析-2023-07-13

1、使用Trim Galore软件对两次数据进行质控&#xff0c;去掉20bp以下的reads vim新建RNA_seq_script_1对CPIV3测序数据进行质控分析 #!/bin/bash # 上面一行宣告这个script的语法使用bash语法&#xff0c;当程序被执行时&#xff0c;能够载入bash的相关环境配置文件。 # Prog…

Java 核心技术 卷I 第4章 对象与类

第4章 对象与类 4.1 面向对象程序设计概述 面向对象程序设计&#xff08;OOP&#xff09;是当今主流的程序设计范型。 Java是完全面向对象的&#xff0c;必须熟悉OOP才能够编写Java程序。 面向对象的程序是由对象组成的&#xff0c;每个对象包含对用户公开的特定功能部分和…

云计算相关概念

文章目录 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云--区别和特性二、华为云&#xff1a;简介、主要业务、特点和优势、不同场景和行业中的应用三、华为云-三剑客&#xff1a;IaaS、PaaS、SaaS 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云–…

驱动程序——字符设备驱动框架

文章目录 编写驱动程序的步骤代码hello_drv.chello_drv_test.c驱动模块代码编译&#xff08;编写Makefile&#xff0c;编译时间短&#xff09;驱动模块代码编译&#xff08;修改Makefile&#xff0c;编译时间长&#xff09;测试 应用调用open函数打开文件应用调用open函数打开设…

学习使用FAsyncTask执行异步任务

目标 要想在另一个线程中执行代码&#xff0c;使用FRunnable是一种方式。而使用FAsyncTask是另一种方式&#xff08;这也是UE的DDC相关代码中所使用的方式&#xff09;。 本篇尝试运行一个 FAsyncTask 的最简单的例子。 1. FAsyncTask 对于任务类的要求 FAsyncTask是一个类…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【4】-O3 不支持 编译失败

gcc -O3 编译失败 结论&#xff1a;默认情况下SPEC CPU 2006 1.2 不支持 gcc -O3编译参数。

谈 Delphi 中 JSON 的简便操作(非常简单)

我曾有讲过Delphi操作JSON的方法&#xff0c;特别是这一篇【delphi】类和记录的 helpers&#xff08;助手&#xff09;。但是因为当时是主要介绍的是Delphi的Helper&#xff0c;大家可能并没注意到Delphi中JSON的简便操作方法。 早期Delphi并没有自己的JSON操作库&#xff0c;大…

51. N 皇后 (递归+回溯)

题目链接&#xff1a;力扣 解题思路&#xff1a;递归回溯&#xff0c;n个皇后不能在同一行&#xff0c;同一列&#xff0c;同一斜线上&#xff0c;需要将n个皇后放在n*n的棋盘上&#xff0c;所以棋盘的每一行一定有一个皇后&#xff0c;因此可以第一行开始&#xff0c;在当前行…

计算机毕设 大数据电商用户行为分析及可视化

文章目录 1. 数据集说明2. 数据处理2.1 数据导入2.2 数据清洗 3.数据分析可视化3.1 用户流量及购物情况3.2 用户行为转换率3.3 用户行为习惯3.4 基于 RFM 模型找出有价值的用户3.5 商品维度的分析 4 最后 1. 数据集说明 这是一份来自淘宝的用户行为数据&#xff0c;时间区间为…