「动态规划」下降路径最小和

力扣原题链接,点击跳转。

有一个n×n的方阵matrix。从这个矩阵的最上面那一行的某一个元素开始,下降到最下面那一行的某一个元素。每次只能走到左下方、正下方和右下方这三者之一,也就是说,从(i,j)只能到达(i+1,j-1)、(i+1,j)和(i+1,j+1)这三者之一。请问,经过的路径上的所有元素的最小和是多少?

我们用动态规划来解决这个问题。创建dp表,先确定状态表示,我们用dp[i][j]表示下降到(i,j)位置的最小和。那么,考虑最近的一步,只有可能是从左上方、正上方和右上方这三者之一下降到该位置。也就是说,要想下降到(i,j),可以先从最上面那一行下降到(i-1,j-1)、(i-1,j)和(i-1,j+1)这三者之一,再下降到(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的第一行?和matrix的第一行是相同的。为了满足:dp的每一个位置都是上边的三个位置的最小值加上matrix这个位置的值,可以把第一行初始化成0。

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

求每个位置上边三个位置的最小值时,最左边和最右边两列的*不能影响结果,只需要把这些*初始化成+∞。由于在原来的dp表中加上了两列一行,dp表的(i,j)应该对应matrix的(i-1,j-1)。根据状态转移方程,每个位置的值只和上边的3个数相关,所以应从上往下填表,确保在填到某一个位置时,它上边的三个位置的值已经填完了。最后,应返回dp表最后一行的最小值。

class Solution
{
public:int minFallingPathSum(vector<vector<int>>& matrix){int n = matrix.size();// 创建dp表vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX));// 初始化for (int i = 0; i < n + 2; i++)dp[0][i] = 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];// 求dp表最后一行的最小值int ret = INT_MAX;for (int i = 1; i <= n; i++)ret = min(ret, dp[n][i]);return ret;}
};

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

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

相关文章

Unity修改Project下的Assets的子文件的图标

Unity修改文件夹的图标 示例&#xff1a; 在右键可以创建指定文件夹。 github链接 https://github.com/SeaeeesSan/SimpleFolderIconCSDN资源的链接 https://download.csdn.net/download/GoodCooking/89347361 去GitHub下载支持原作者哦。重要的事情 截图来自GitHub 。 U…

【高阶数据结构】跳表

文章目录 跳表1. 什么是跳表-skiplist2. skiplist的效率如何保证&#xff1f;3.skiplist的实现4.skiplist跟平衡搜索树和哈希表的对比 跳表 1. 什么是跳表-skiplist skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价…

Docker安装MongoDB(Linux版)

文章目录 前言一、Docker环境的准备1.安装依赖2.安装Docker 二、使用Docker安装MongoDB1.mongo版本选取2.拉取合适的镜像3.宿主机创建MongoDB需要挂载的文件夹4.第一次无认证创建mongo用户5.启动需要认证的mongo容器 问题汇总总结 前言 本文章主要介绍在Centos系统&#xff0c…

java中的TreeMap类和Hashtable类+Map集合遍历+集合小结

一、TreeMap类 实现了Map接口&#xff0c;元素为键值对、键不可重复、值可重复 特点&#xff1a;可排序 要求&#xff1a;Key类必须实现Comparable接口 底层结构&#xff1a;红黑树 1、可排序 2、常用方法 与HashMap一致 二、Hashtable类 实现了Map接口&#xff0c;元素…

【JVM之打破双亲委派】

Jvm之打破双亲委派 1. 双亲委派2.打破双亲委派 1. 双亲委派 // ClassLoader中的方法 protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has alread…

【Qt】如何优雅的进行界面布局

文章目录 1 :peach:写在前面:peach:2 :peach:垂直布局:peach:3 :peach:水平布局:peach:4 :peach:网格布局:peach:5 :peach:表单布局:peach: 1 &#x1f351;写在前面&#x1f351; 之前使⽤ Qt 在界⾯上创建的控件, 都是通过 “绝对定位” 的⽅式来设定的。也就是每个控件所在…

kubenetes中K8S的命名空间状态异常强制删除Terminating的ns

查看ns状态为异常&#xff1a; 查看ns为monitoring的状态为Termingating状态 使用方法一&#xff1a; kubectl delete ns monitoring --force --grace-period0 使用方法二&#xff1a; kubectl get ns monitoring -o json > monitoring.json 修改删除文件中的"kubern…

Oracle行迁移解析

行迁移&#xff08;Row Migration&#xff09;是Oracle数据库中的另一个现象&#xff0c;它与行链接类似&#xff0c;都是由于数据行大小的变化导致的存储问题&#xff0c;但其本质和影响有所不同。 触发条件&#xff1a;行迁移发生在当一个已存在的、原先能够完全存储在一个数…

Redis优化笔记

Redis优化 一&#xff1a;Key&#xff1a; 1.1.Key的规范&#xff1a; 测试如下&#xff1a; 1.2.拒绝BigKey&#xff1a; 我们可以用&#xff1a; MEMORY USAGE name命令来看它的大小。 注意&#xff0c;这里的第二种之所以不使用Keys *&#xff0c;因为在实际生产时&#…

强化学习算法

从上图看出&#xff0c;强化学习可以分成价值/策略、随机策略/确定策略、在线策略/离线策略、蒙特卡洛/时间差分这四个维度。这里分析了基础算法中除了在线策略/离线策略以外的其他维度。 &#xff08;一&#xff09;基础知识 一、基础概念 重点概念&#xff1a;状态S、动作A、…

leetcode题目16

最接近的三数之和 中等 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], targ…

Android:使用Kotlin搭建MVC架构模式

一、简介Android MVC架构模式 M 层 model &#xff0c;负责处理数据&#xff0c;例如网络请求、数据变化 V 层 对应的是布局 C 层 Controller&#xff0c; 对应的是Activity&#xff0c;处理业务逻辑&#xff0c;包含V层的事情&#xff0c;还会做其他的事情&#xff0c;导致 ac…

切换分支报错:Untracked Files Prevent Checkout

切换分支报错&#xff1a;Untracked Files Prevent Checkout 分支切换 Untracked Files Prevent Checkout 新起的项目在切换master分支到工作分支时&#xff0c;出现下图的问题&#xff1a; Untracked Files Prevent Checkout Move or commit them before checkout 网上的解决…

回溯算法05(leetcode491/46/47)

参考资料&#xff1a; https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 491. 非递减子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素…

大数据智慧消防解决方案(24页PPT)

方案介绍&#xff1a; 大数据智慧消防解决方案是提升消防安全管理水平、保障人民群众生命财产安全的重要手段。通过集成物联网、云计算、大数据、人工智能等先进技术&#xff0c;构建集监测、预警、指挥、救援于一体的智慧消防系统&#xff0c;将为消防安全事业注入新的活力。…

工业级3D开发引擎HOOPS:创新与效率的融合!

在当今这个技术日新月异的时代&#xff0c;3D技术已成为推动各行各业发展的重要力量。从工程设计到游戏开发&#xff0c;从虚拟现实到增强现实&#xff0c;3D技术的应用无处不在&#xff0c;它极大地丰富了我们的生活和工作。而在这样的背景下&#xff0c;HOOPS作为一个强大的3…

vue watch深度监听数组每一项的变化

在 Vue 中&#xff0c;watch 选项默认只能监听对象的属性变化&#xff0c;无法直接监听数组的变化 监听数组变化 一般情况下我们监听数组变化&#xff0c;可以监听长度的变化 watch(() > list.value.length, (now, old) > {// 会在数组长度变化时触发 })上面的写法不能…

面试被问到sizeof的概念

面试被问到sizeof的概念 问题1: 定义一个空的类型 ,里面没有任何成员函数,和成员变量,对该类型求sizeof ,得到的结果是多少? 问题2: 如果在该类型中添加一个构造函数和析构函数呢? 问题3:如果将析构函数标记为虚函数呢? 解答: struct student{}; struct student stu; s…

爬虫技术升级:如何结合DrissionPage和Auth代理插件实现数据采集

背景/引言 在大数据时代&#xff0c;网络爬虫技术已经成为数据收集的重要手段之一。爬虫技术可以自动化地从互联网上收集数据&#xff0c;节省大量人力和时间成本。然而&#xff0c;当使用需要身份验证的代理服务器时&#xff0c;许多现有的爬虫框架并不直接支持代理认证。这就…

CSS动画技术(css-animation)

掌握CSS动画技术 一、CSS动画基础 1. 什么是CSS动画&#xff1f; CSS动画是一种在网页上创建动态效果的技术&#xff0c;通过CSS样式规则来实现元素的平滑过渡和变换。CSS动画通过改变属性值来控制元素的动态外观&#xff0c;如位置、大小、颜色、透明度等。 2. CSS动画与传…