【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题

加qq1126137994 一起学习更多技术!!!

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

给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100.

测试样例:
[[1,2,3],[1,1,1]],2,3
返回:4

分析
假设矩阵m的大小为M*N,行数为M,列数为N,生成大小和m一样的矩阵dp,行数为M,列数为N,dp[i][j]的值等于m矩阵从左上角,也就是(0,0)
走到(i,j)位置的最小路径和。
这里写图片描述
第一行与第一列,通常都是可以通过一个循环求出来的:
第一行的值:只能是从左往右走,路径最小值为前一个方格的路径最小值加上本方格所对应的权值,即dp[0][j] = dp[0][j-1]+m[i][j]
第一列的值:只能是从上往下走,路径最小值为上一个方格的路径最小值加上本方格所对应的权值;即dp[i][0] = dp[i-1][0]+m[i][j]

那么除了第一行和第一列的值,其他部分的值为(只能是从上面过来,或者从左边过来):
这里写图片描述
最终,右下角的值,就为我们所要求的值:
这里写图片描述

实现代码如下:

class MinimumPath {
public:int R_min(int m,int n){if(m>=n)return n;elsereturn m;}int getMin(vector<vector<int> > map, int n, int m) {// write code here//额外开辟一个dp矩阵,并将dp矩阵所有值初始化为0vector<vector<int> > dp(n,vector<int>(m,0));//矩阵的第一个空格的值就等于map矩阵的第一个值的本身dp[0][0]= map[0][0];//先求第一行的值for(int j=1;j<m;j++){dp[0][j] = dp[0][j-1] + map[0][j];}//再求第一列的值for(int i=1;i<n;i++){dp[i][0] = dp[i-1][0] + map[i][0];}//最后求其他行的值for(int i=1;i<n;i++){for(int j=1;j<m;j++){dp[i][j]=R_min(dp[i-1][j]+map[i][j],dp[i][j-1]+map[i][j]);}}return dp[n-1][m-1];}
};

以上程序,求两个数的最小值并返回是可以不写的。可以直接用库函数min();但是我是因为不熟悉C++的库函数,所以自己写了一个,影响不大!!!

以上的分析思路,依然是:先解决子问题!!!何为子问题?就是我们把所要求的整体的问题,化简到最简单的情况,比如,上面的题,我们要求走到最右下角的路径的最小值,那么我们就化简,化简到,整个矩阵为1个方格,2个方格,3个方格,4个方格…… 时的最短路径的求解,然后,前面的子问题求出来了,我们会发现,通过前面子问题的整合,可以求得整体问题,也就是最终,我们可以求得最右下角的值,这也避免了,很多的重复计算,更加避免了递归所带来的复杂的运算顺序!!!

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

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

相关文章

mysql数据库思维导图

先前总结的一下数据库的思维导图&#xff0c;和大家分享一下&#xff0c;持续更新&#xff1b; 最近面试数据仓库工程师&#xff0c;过程中&#xff0c;问到索引类型&#xff0c;只是记得&#xff0c;普通索引&#xff0c;唯一索引&#xff0c;还有主键&#xff0c;面试中让说…

【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 这是一个经典的LIS(即最长上升子序列)问题&#xff0c;请设计一个尽量优的解法求出序列的最长上升子序列的长度。 给定一个序列arr及它的长度n(长度小…

数据思维

最近听的一本书&#xff0c;《数据思维》&#xff1a;分享一下 1.【数据定义】 能被电子化的叫做数据&#xff0c;滴滴司机数据化&#xff0c;ofo数据化&#xff0c;堵车数据化&#xff0c;太形象了&#xff0c;数据以后会是电&#xff1b; 注意&#xff01;数据与自己业…

【常见笔试面试算法题12续集四】动态规划算法案例分析4 LCS练习题练习题(最长公共子序列的长度)

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 给定两个字符串A和B&#xff0c;返回两个字符串的最长公共子序列的长度。例如&#xff0c;A"1A2C3D4B56”&#xff0c;B"B1D23CA45B6A”&am…

MSMQ(MicroSoft Message Queue,微软消息队列)

MSMQ(MicroSoft Message Queue&#xff0c;微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式&#xff0c;相互通信的应用可以分布于同一台机器上&#xff0c;也可以分布于相连的网络空间中的任一位置。它的实现原理是&#xff1a;消息的发送者把自己想要发送…

hive 思维导图

1.整理了word文档&#xff0c;但是感觉没有思维导图清晰 &#xff0c;持续更新中 ​ hive 工作中分享。

【常见笔试面试算法题12续集五】动态规划算法案例分析5 01背包练习题

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 一个背包有一定的承重cap&#xff0c;有N件物品&#xff0c;每件都有自己的价值&#xff0c;记录在数组v中&#xff0c;也都有自己的重量&#xff0c;…

结构思考力思维导图

个人提升&#xff0c;喜欢钻研的同时&#xff0c;需要增加一下&#xff0c;其他方面的知识&#xff0c;分享一下&#xff1a;

我的JavaScript for Visual Studio插件开源了

最近忙于别的事情&#xff0c;我的JavaScript for Visual Studio插件一直没有做什么更新了很是对不起大家。不过觉得这个东西如果做好的话对大家还是有帮助的&#xff0c;所以我还是把代码share出来&#xff0c;这样大家可以一起来扩展&#xff0c;人多力量大嘛我希望大家一起来…

常用内存分配函数的说明

下面哪种C/C 分配内存的方法会将分配的空间初始化为0 A malloc() B calloc() C realloc() D new[ ] 1) malloc 函数&#xff1a; void *malloc(unsigned int size) 在内存的动态分配区域中分配一个长度为size的连续空间&#xff0c;如果分配成功&#xff0c;则返回所分配…

前端学习(120):css精灵和好处

精灵图的目的&#xff1a;很多大型网站在首次加载的时候需要加载很多小图片&#xff0c;如果在同一时间&#xff0c;服务器又拥堵的话&#xff0c;就会导致页面加载慢。为了解决这一问题&#xff0c;就用了精灵图来解决加载时间过长影响用户体验的问题。 精灵图的本质&#xf…

Windows 2008上安装VS2008SP1时的怪异错误

由于重做系统&#xff0c;需要重新安装开发工具&#xff0c;于是开始了坚苦而漫长的安装。 不料在安装VS 2008 SP1时&#xff0c;安装到Microsoft .net framework 3.5 SP1时出错了&#xff0c;我就感觉纳闷了&#xff0c;这种安装过程我都安装了N次了还没出过什么错&#xff0c…

【常见笔试面试算法题12续集六】动态规划算法案例分析6 最优编辑练习题

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 对于两个字符串A和B&#xff0c;我们需要进行插入、删除和修改操作将A串变为B串&#xff0c;定义c0&#xff0c;c1&#xff0c;c2分别为三种操作的代价…

shell 思维导图

分享一下&#xff1b;

《大败局》读书笔记

史玉柱犯了一个很多青年企业家都容易犯的错误&#xff1a;把预期的利润当成了实际的收益&#xff0c;并以此为基数来设定自己的规划。 制度重于技术。 秩序重于利益。 职业人格缺陷。 市场是很公平的&#xff0c;你怎么从暴利中得来的钱&#xff0c;你得再怎么赔进去。 如果管理…

计数排序的应用----排序字符串

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 题目&#xff1a; 给你一个原始字符串&#xff0c;根据该字符串内每一个字符串出现的次数&#xff0c;按照ASCII码递增的排序重新调整输出。 举例: eeefgghh 则每种字…

Linux 总线、设备、驱动模型的探究

学习交流加 个人qq&#xff1a;1126137994 个人微信&#xff1a;liu1126137994 学习交流资源分享qq群&#xff1a;962535112之前一直做项目&#xff0c;做项目的过程虽然也学习到了不少知识&#xff0c;但是&#xff0c;一直没有好好研究总线设备驱动的机制&#xff0c;今天来学…

面试题:移动数组的元素

加qq 1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 描述 试设计一个算法&#xff0c;将数组a中的元素a[0]至a[n-1]循环右移k位&#xff0c;并要求只用一个元素大小的附加存储&#xff0c;元素移动或交换次数为O(n)。 输入 先输入一个大于1且小于100的…

n个字符串按照字典序排列

题目描述 给定n个字符串&#xff0c;请对n个字符串按照字典序排列。 输入描述: 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。 输出描述: 数据输出n行&#xff0c;输出结果为按照字典序排列的字符串。 输入例子:…