矩阵的最小路径和二维动态规划的空间压缩

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

举例:

路径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];
}

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

时间: 2024-11-08 20:06:23

矩阵的最小路径和二维动态规划的空间压缩的相关文章

【动态规划专题】2:矩阵的最小路径和

<程序员代码面试指南--IT名企算法与数据结构题目最优解> 左程云 著 矩阵的最小路径和 [题目]给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和. [举例]如果给定的m如下:1 3 5 98 1 3 45 0 6 18 8 4 0路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回12. 关键思路:假设有一个M*N的数组 dp[M][N], dp[i][j]的值表示从左上角(0,0)位置走到(i

[DP]矩阵的最小路径和

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

BZOJ 2738 矩阵乘法(整体二分+二维树状数组)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2738 [题目大意] 给出一个方格图,询问要求求出矩阵内第k小的元素 [题解] 我们对答案的大小进行整体二分,用二维树状数组维护二维区间和, 将超过数量的分治到左区间,不满足的分治到右区间即可. [代码] #include <cstdio> #include <algorithm> #include <cstring> using namespace std;

6461. 【GDOI2020模拟02.05】生成树(矩阵树及其扩展、二维拉格朗日插值)

题目描述 给定一张 N 个点,M 条边的无向图,边有红.绿.蓝三种颜色,分别用 1,2,3 表示. 求这张图有多少生成树,满足绿色边数量不超过 x,蓝色边数量不超过 y,答案对10^9 + 7 取模. 1 ≤ N ≤ 40,1 ≤ M ≤ 10^5,1 ≤ ci ≤ 3 行列式 定义矩阵A的行列式det(A)或|A| \(|A|=\sum_{排列p}{(-1)^{p的逆序对个数}\prod{A_{i,p[i]}}}\) 行列式的性质 (\(A\)的转置矩阵\(A^T\):把\(A\)的行列互换)

4.2 矩阵的最小路径和

[题目]: 给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径和中最小的路径和 举例: 如果给定的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 原文地址:https://www.cnblogs.com/latu

矩阵的最小路径和

给你一个数组,求从[0,0]位置到[n-1,m-1]的最短路径. 数组如图所示: 1 3 5 9 8 2 3 4 5 0 6 1 8 8 4 0 路径1→3→1→0→6→1→0是所有路径中路径和最小的,所以返回12 代码: public class MinpathSum{ //时间复杂度O(M*N),空间复杂度O(M*N) public static int minPathSum1(int[][] matrix) { if(matrix == null || matrix.length==0 |

POJ 1050 二维动态规划转变成枚举加一维的动态规划!

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <climits> #include <cstring> #include <cmath> #include <map> #include <set> using namespace s

Qrcode生成二维码的参数总结 及最小尺寸的测试

Qrcode生成二维码,做过很多实验,探索最小规格的二维码到底是多少尺寸,和最高规格的二维码到底是多大尺寸.现在我总结总结: 有两种思路: 1.生成规格高的二维码,然后压缩到自己想要的尺寸的二维码.这种:压缩算法不好的时候会很坑爹. 2.根据调整的参数生成原图,这种图是比较清晰的,打印出来都可以很好的被识别. 先说说第二种吧:根据测试, 1.不设置任何东西时:根据测试 最小的二维码尺寸是45--47:宽高(对于1---14个字符), 第二梯度:54-56:宽高(对于15--26字符) 第三梯度:

poj 1195:Mobile phones(二维树状数组,矩阵求和)

Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14489   Accepted: 6735 Description Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area is divided into squares. The