博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
矩阵的最小路径和二维动态规划的空间压缩
阅读量:6341 次
发布时间:2019-06-22

本文共 1714 字,大约阅读时间需要 5 分钟。

题目:给定一个矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有的数字累加起来作为这条路径的路劲和。要求返回所有路径和中的最小路径和。

举例:

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

 

解析:

这个题目很类似之前的那个动态规划的数字三角的问题。毫无疑问的,这个问题也是用动态规划解决。只要确定了状态和转移方程,这个题目很容易解决。下面直接给出代码:

//利用path记录路径,对于每一个path[i][j],0代表dp[i][j]的值从上面加过来,1代表dp[i][j]的值从左边加过来int minPathSum1(int matrix[][col], int dp[][col], int path[][col]){	if(matrix == NULL)	{		return 0;	}	dp[0][0] = matrix[0][0];	//计算第一列的值	for(int i = 1; i < row; i ++)	{		dp[i][0] = dp[i - 1][0] + matrix[i][0];		path[i][0] = 0;	}	//计算第一行的值	for(int j = 1; j < col; j++)	{		dp[0][j] = dp[0][j- 1] + matrix[0][j];		path[0][j] = 1;	}	//计算其它的值	for(int i = 1; i < row; i++)	{		for(int j = 1; j < col; j++)		{			int direction = dp[i][j-1] < dp[i-1][j] ? 1 : 0;			dp[i][j] = (direction ?  dp[i][j-1] : dp[i-1][j]) + matrix[i][j];			path[i][j] = direction;		}	}//for	return dp[row - 1][col - 1];}

  这里在dp上存储每个点的最短路径和,在path上存储这个最短路径是哪个点过来的。这样就能在找到最短路径和的同时,把路径一块找到。

二维动态规划的空间压缩

上面的题目很简单,不是这篇文章的重点,下面来看一下二维动态规划的空间压缩问题。上面的动态规划的时间复杂度是O(M*N),空间复杂度就是二维数组的大小O(M*N)。空间压缩的方法是不用记录所有的子问题的解。所以就可以只用一个行数组记录第一行、第二行...一次计算。直到最后一行,得到dp[N-1]就是左上角到右下角的最小路径和。

代码实现:

int minPathSum2(int matrix[][col], int dp[]){	dp[0] = matrix[0][0];	//计算第一行的最短路径	for(int j = 1; j < col; j++)	{		dp[j] = dp[j-1] + matrix[0][j];	}	//计算除了第一行的其它最小路径和	for(int i = 1; i < row; i++)	{		for(int j = 0; j < col; j++)		{			if(j == 0)			{				dp[j] += matrix[i][j];			}			else			{				dp[j] = dp[j-1] < dp[j] ? dp[j-1] : dp[j];				dp[j] += matrix[i][j];			}		}//for	}//for	return dp[col - 1];}

  这种二维动态规划的空间压缩几乎可以应用到所有的二维动态规划的题目中,通过一个数组(列数组或者航数组)滚动更新的方式节省了大量的空间。但是在滚动的过程中动态规划表不断的被行数组或者列数组覆盖更新,最后得到的仅仅是动态规划表的最后一行或者最后一列的最小路径和。所以真正的最小路径是不能通过动态规划表回溯得到的。

转载于:https://www.cnblogs.com/stemon/p/4635256.html

你可能感兴趣的文章
[LeetCode] Spiral Matrix 解题报告
查看>>
60906磁悬浮动力系统应用研究与模型搭建
查看>>
指纹获取 Fingerprint2
查看>>
SB阿里云,windows2012r2无法安装.net3.5
查看>>
函数的继承
查看>>
黑盒测试用例设计方法&理论结合实际 -> 场景法
查看>>
快速打开软件以及文件夹
查看>>
CSS选择符
查看>>
剑指offer---19--***-顺时针打印矩阵
查看>>
关于数组随机不重复的思路
查看>>
oracle赋值问题(将同一表中某一字段赋值给另外一个字段的语句)
查看>>
Windows 安装 Jenkins 2.6
查看>>
计算一个点是否在一个区域中
查看>>
正则表达式
查看>>
淘宝面试题:有一个一亿节点的树,现在已知两个点,找这两个点的共同的祖先。...
查看>>
EntityFramework 6.x多个上下文迁移实现分布式事务
查看>>
高版本SQL备份在低版本SQL还原问题
查看>>
一键安装最新内核并开启 BBR 脚本
查看>>
C# 绘制图表(柱状图,线性图,饼状图)
查看>>
.NET中使用Redis
查看>>