矩阵的最小路径和 [DP]

[DP题解]矩阵最小路径和问题 [DP题解]矩阵最小路径和问题 【题目】给定一个矩阵,例如demo,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径和中最小的路径和。 算法分析: 这是一个典型的动态规划算法问题。 分析如下: 例如下图中的矩阵demo,1-3-1-0-6-1-0 的路径和最小,值为12. 再看: 例如: 由此进行算法设计: ... 阅读详情


从本文开始,我打算多刷一些动态规划的题。不仅如此,各种典型算法也会在分类刷一刷。


【题目】

给定一个矩阵,从左上角开始每次只能向右或者右下走,最后到达右下角的位置,路径上所有数字累加起来就是路径和,返回所有路径中最小的路径和。

【举例】

如果给定的m如下:

1,3,5,9

8,1,3,4

5,0,6,1

8,8,4,0

路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回12。

【解答】

这道题是很明显的动态规划算法,动态规划算法的一般步骤就是列一张表来存放计算过的值,通常采用数组实现。这道题的特殊之处在于表的值不仅和自身有关,而且和原矩阵也是相关的。表中的值需要和原矩阵中的值相加,因为我们求的是路径和。

矩阵如下,只画了一部分,动态规划通常会申请+1的空间,i=0和j=0用来存放动态规划的初始值,这里我们赋为0,这张表是B[m+1][n+1]。

:0 1 2 3 4 

0: 0 0 0 0 0

1: 0 1 4 9 18

2: 0 9 5

...

不难看出,B[1][j]和B[i][1]是取它上下两个相邻值再加上原数组A[i-1][j-1]的值(看1和4),为什么减一是因为规划表真实数据从1开始而不是从0开始。这些其实是为了初始化下标为1的这些点。

除了下标为i=1或j=1的部分,其他值(看5)是上下相邻两个值得最小值与原数组A[i-1][j-1]的值相加。这就是dp数组的公式了。

我第一种解法就没有初始化,直接放在循环里面做了,不过效率肯定不高,下面是我第一种解法,可以和第二种对比一下。

 for(int i=1; i<=m; ++i){
        for(int j=1; j<=n; ++j){
            if(i == 1 || j == 1)
                B[i][j] = std::max(B[i-1][j], B[i][j-1]) + A[i-1][j-1]; 
            else
                B[i][j] = std::min(B[i-1][j], B[i][j-1]) + A[i-1][j-1]; 
        }   
    }   

其实最早的第一次解我都没有考虑到下标为1的应该是max,当时我直接只用了一个min,然后求得结果为11,还好我认识到了错误。

起始也不用std::max,直接相加就行了

下面看第二种完整代码,注意第二种只是参考,还有第三种,我没有删除这个是为了警示我自己考虑要周全,突然又想到的。

int min_path(const std::vector<std::vector<int>>& A)
{   
    if(A.size() == 0)
        return 0;
    
    int m = (int)A.size();
    int n = (int)A[0].size();
    std::vector<std::vector<int>> B(m+1, std::vector<int>(n+1, 0));
    
    for(int i=1; i<=m; ++i)
        B[i][1] = B[i-1][1] + A[i-1][0];
    for(int j=1; j<=n; ++j)
        B[1][j] = B[1][j-1] + A[0][j-1];
        
    for(int i=2; i<=m; ++i){
        for(int j=2; j<=n; ++j){
            B[i][j] = std::min(B[i-1][j], B[i][j-1]) + A[i-1][j-1]; 
        }   
    }   
    
    return B[m][n];
}

第三种:分配同样的大小就可以了,不需要i-1和j-1了。

int min_path(const std::vector<std::vector<int>>& A)
{
    if(A.size() == 0)
        return 0;

    int m = (int)A.size();
    int n = (int)A[0].size();
    std::vector<std::vector<int>> B(m, std::vector<int>(n, 0));
    
    B[0][0] = 1;
    for(int i=1; i<m; ++i)
        B[i][0] = B[i-1][0] + A[i][0];
    for(int j=1; j<n; ++j)
        B[0][j] = B[0][j-1] + A[0][j];
    
    for(int i=1; i<m; ++i){
        for(int j=1; j<n; ++j){
            B[i][j] = std::min(B[i-1][j], B[i][j-1]) + A[i][j]; 
        }   
    }   
    
    return B[m-1][n-1];
}   
第三种直接分配相同大小的空间就可以了。唉,动态规划分配空间就是要么加1,要么不加1,我还是不够熟练。


测试用例:

int main()
{
    std::vector<std::vector<int>> A = { {1, 3, 5, 9},
                                        {8, 1, 3, 4},
                                        {5, 0, 6, 1},
                                        {8, 8, 4, 0}};
    int find = min_path(A);
    std::cout<<"the min path is : "<<find<<std::endl;

    typedef std::vector<std::vector<int>>::iterator iterator1;
    typedef std::vector<int>::iterator iterator2;

    for(iterator1 iter= A.begin(); iter!=A.end(); ++iter){
        for(iterator2 it = (*iter).begin(); it!=(*iter).end(); ++it)
            std::cout<<*it<<' ';
        std::cout<<std::endl;
    }

    return 0;
}

继续刷题中。。。

动态规划之矩阵的最小路径和 动态规划方法计算矩阵的最短路径。 阅读详情

相关推荐

动态规划求矩阵两点最短路径

给定M*N的矩阵,其中的每个元素都是-10到10之间的整数。你的任务是从左上角(1,1)走到右下角(M,N),每一步只能够向右或者向下,并且不能够走出矩阵的范围。你所经过的方格里的数字都必须被选取,请找出一条最合适的道路,使得在路上被选取的数字之和尽可能的小。

【算法设计与分析】DP习题

7-1 最小路径和给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的和。求矩阵的最小路径和。输入格式:输入第一行:两个正整数m和n(1

weixin_55664293的博客 1905

STM32 ADC精准采集12V电池电压:从分压电路到软件校准全解析

本文详细解析了STM32 ADC精准采集12V电池电压的全过程,涵盖分压电路设计、电阻选型、ADC配置优化及软件校准方法。针对电池电压监测中的噪声、温漂等挑战,提供了硬件滤波与软件过采样等实战技巧,确保测量精度达到1%以内,满足嵌入式设备对电源管理的严苛要求。

tech5的博客 1016

弗洛伊德(Floyd)算法

Dijkstra解决的是单源路径最短,即我们只能求某一点到其他所有点的最小距离。 而Floyd算法可以求任意两点间的最小距离; 单源最短路径一定能用Floyd算法去解,但是Floyd时间复杂度比迪杰斯特拉要高,所以一般只有多源最短路径采用Floyd算法 基本思想: 这是一个动态规划的思想,核心思想为,从A到B只经过前N个中转站所能获得的最小距离为多少。 可以想象到,这个算法就是一个包含三个循环的d...

很吵请安静 1963

无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架

Solon 是新一代,Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目(最近“杭州六小龙”很火啊,我们也是杭州的哦)。从零开始构建(No Spring、No Java-EE、No Servlet),有灵活的接口规范与开放生态。采用对商用友好的 Apache 2.0 开源协议。

向往自由的少年!(我是一个少年!!!) 1700

Qualcomm工具的使用

简介   由于我们公司主要是以高通平台为主,所以工具的使用是必不可少的,包括QPST、QRCT3、QXDM、QDART等。   高通工具顾名思义就是,对于高通平台的软件开发进行软件的烧录,软件的调试,软件的Log的抓取和分析过程,像我们平常用的大致就是烧版本、改NV、制作QCN、然后校准、强发强收等操作。 QPST   QPST主要是用来做一些参数的配置,包括EFS文件的编辑,QCN的导入和备份与...

Jimmy 2万+

七、最短路径——弗洛伊德(Floyd)算法

为了能讲明白弗洛伊德(Floyd)算法的精妙所在,我们先来看最简单的案例。下图是一个最简单的3个顶点连通网图。 我们先定义两个二维数组D[3][3]和P[3][3],D代表顶点到顶点的最短路径权值和的矩阵。P代表对应顶点的最小路径的前驱矩阵。在未分析任何顶点之前,我们将D命名为,其实它就是初始的图的邻接矩阵。将P命名为,初始化为图中所示的矩阵。 首先我们来分析,所有的顶点经过v0后到达另一顶点的最短路径。因为只有...

ThinPikachu的博客 2万+

Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法

Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法 目录 Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、实现步骤 六、关键代码 一、简单介绍 Unity中的一些基础知识点。 本节介绍,Asset Bundle 在 Unity中的使用,入门第一篇,如何AssetBundle标记,如何打包成AssetBundle的操作方法,有不对的地方欢迎指正。...

仙魁XAN 1万+

动态规划DP算法理解

每次决策依赖于当前状态,又随即引起状态的转移,多阶段最优化决策解决问题的过程就称为动态规划。

m0_55369183的博客 2554

解锁RK3588 HDMI输出:分辨率与EDID的深度探索

本文详细探讨了瑞芯微RK3588处理器的HDMI输出分辨率配置与EDID解析技术。文章首先介绍了RK3588处理器的性能特点及其HDMI功能在多媒体和工业领域的应用价值,随后分别阐述了HDMI输出分辨率的硬件连接要求和软件配置方法,包括4K/8K等不同分辨率的配置实例。在EDID部分,深入解析了EDID的数据结构、交互机制,以及数据获取与修改的具体方法。最后总结了配置过程中常见问题的解决方案,并展望了RK3588在高分辨率显示领域的发展前景。全文为开发者提供了RK3588 HDMI显示配置的完整技术指南。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 593

硬件工程师笔记——电子器件汇总大全

本文系统总结了14种常用电子器件的工作原理及功能应用,包括电阻、压敏电阻、电容、电感、二极管、三极管、MOS管、晶振、光耦、IGBT、继电器、磁珠、可控硅和线性稳压器。每种器件从结构原理、工作特性到典型应用进行全面解析,如电阻的限流分压、电容的储能滤波、三极管的放大开关等。重点阐述了各器件在电路设计中的关键作用,如IGBT的功率控制、继电器的隔离保护、LDO的电压稳定等,并提供了实际电路应用案例。文章还整理了硬件工程师笔试面试相关的知识点和真题资源,为电子工程师提供全面的技术参考。

XU157303764的博客 2万+

[DP]矩阵的最小路径和

题目 给定一个矩阵m, 从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的树子累加起来就是路径和,返回所有的路径中最小的路径和. 解法一 这是一道经典的动态规划题,状态转移方程为dp[i][j] = min{dp[i - 1][j], dp[i][j - 1]} + m[i][j].可以用一个二维的dp矩阵来求解.对于dp矩阵,第一行和第一列只会有一种走法,就是...

222

钢结构焊接连接工艺

钢结构焊接连接工艺

wwdoffice950426的博客 61

线性dp:DP11 矩阵的最小路径和

描述 给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。 输入描述: 第一行输入两个正整数 n 和 m 表示矩阵 a 的长宽 后续输入 n 行每行有 m 个数表示矩阵的每个元素 输出描述: 输出从左上角到右下角的最小路径和。 #include<iostream> #include<vector> #include<algorithm> using n

香蕉的博客 490

SAP SD模块定价过程后台配置简介

只有手工输入定价时(例如,在定价中的定价浏览屏幕中),或者只有从外部处理转移这些定价时(例如,成本核算),才将这些定价包括在确定(价格确定、输出确定,批次确定)之中。定价过程的定义和分配是SD模块中最核心的配置,包含了条件表、条件类型、存取顺序、发票类型、客户定价过程等,确定了销售订单已什么价格销售、税率、附加折扣等多个条件行程有一个定价过程。12、小计:记录该条件类型在VBAP表中是否存储,以及其后续用途,如记入信贷,占用信贷额度,记入成本等,如果需要金额暂用信贷额度的话,在小计这里选择A即可。

我小时候很黑的博客 3784

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

NO.84十六届蓝桥杯备战|动态规划-路径类DP|矩阵的最小路径和|迷雾森林|过河卒|方格取数(C++)

路径类dp是线性dp的⼀种,它是在⼀个n×m的矩阵中设置⼀个⾏⾛规则,研究从起点⾛到终点的⽅案数、最⼩路径和或者最⼤路径和等等的问题。贪⼼+两次dp是错误的,因为两次最优不等于全局最优,可以举出反例。正解应该是同时去⾛两条路,两者相互影响,所以放在⼀起考虑。

ChoSeitaku的博客 1894

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

矩阵的最小路径之和dp

  Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right a...

u010325193的博客 305

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

矩阵的最小路径和(机器人dp升级版)

/** * * @param matrix int整型二维数组 the matrix * @return int整型 */ function minPathSum( matrix ) { // write code here let m = matrix.length; let n = matrix[0].length; let dp = [] for(let i=0;i<m;i++){ dp[i] = new Array(n) .

SevenLee的个人博客 212

dp_矩阵最小路径

有一个矩阵map,它每个格子都有一个权值。从左上角的格子开始每次只能向右或则向下走,最后达到右下角的位子,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。 解析 public class getMinPath { int getMin(int[][]map,int n,int m){ int[][]dp =new int[n][m]; ...

jcsyl_mshot的博客 374

蓝桥杯备考---》路径类dp之矩阵的最小路径和

定义状态表示 f[i][j]表示从(1,1)到(i,j)的最小路径和。step3:初始化 全部初始化为无穷大,f[0][1]或者f[1][0]设为0。step4:填表顺序,从上到下,从左往右。step5:答案存储在f[n][m]step2:推导状态转移方程。接下来就是振奋人心的代码环节。

2301_81772249的博客 165

蓝桥杯备考:动态规划路径类DP之矩阵的最小路径和

step1:确定状态表示 f[i][j]表示(1,1)到(i,j)的最短距离。如题,要求左上角到右下角的最短路径,我们还是老样子按顺序做。step3:确定填表顺序,应该是从上到下,从左到右。step5 找结果,结果就存在f[n][m]这里。好的,我们直接来实现一下代码就行了。step2 :推导状态表达方程。

2301_81772249的博客 777

牛客热题:矩阵的最小路径和

​ 首先我们发现遍历dp数组的时候,只会利用到dp数组的左上位置的信息。所以我们可以将dp数组缩减为一维数组的形式,重复利用这部分空间。其中的数据并不是我们想要的。所以我们进行了反向填写的操作。, 我们优化了空间,使用了长度等于第二个字符串的dp数组。的做法之前的j的正向遍历悠久导致。的时间复杂度应该是O(N);的时间复杂度应该是O(N);相当于遍历了一遍二维数组。使用了一个二维的dp数组。相当于遍历了一遍二维数组。

本科在读,致力于Linux/C++方向的学习,同时涉及数据结构与算法,操作系统,数据库mysql等等 1379

Python矩阵的最小路径和

题目: 给定一个矩阵m, 从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。 思路: 这是经典的动态规划题。矩阵m的大小为N行M列。 假设m如下: 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 首先生成一个大小和m一样的矩阵dp,dp中的每个元素用于记录从(0,0)位置到达该位置的最小路径和。对于dp[i][j].

sjq_915的博客 2253

C++——矩阵的最小路径和

矩阵的最小路径和:动态规划思想。 生成大小和输入矩阵matrix一样大小的矩阵dp,dp[i][j]表示从左上角(0,0)位置走到(i,j)位置的最小路径和,当i=n-1,j=m-1时,dp[i][j]就是矩阵的最小路径和。 首先对于第一行(n=0),到达每一列的位置只能由前一列位置水平走过去(因为规定只能向右或向下走);对于第一列(m=0),到达每一行的位置只能由前一行位置垂直走过去;所以我们要单独处理dp[0][j](到达第一行的每一列位置的最小路径和,即当前位置的值matrix[0][j]加上..

一抹阳光的博客 2664

矩阵的最小路径之和

思路和想法摘自《程序员代码面试指南》 package JobInterview_01; public class minPathSumDemo { public static int minPathSum(int[][] m) { // 判定矩阵不为空,矩阵的行列的长度不为0 ,元素不为空 if (m == null || m.length == 0 || m[0].length =

shuididishui007的博客 626

[动态规划] 矩阵最小路径和

动态规划 矩阵最小路径和

一个码农的前三十年 447
上一篇: muduo库的EventLoop类剖析
下一篇: 29. Divide Two Integers
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值