[DP题解]矩阵最小路径和问题

[DP题解]矩阵最小路径和问题

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

算法分析:

这是一个典型的动态规划算法问题。

分析如下:

例如下图中的矩阵demo,1-3-1-0-6-1-0 的路径和最小,值为12.

[DP题解]矩阵最小路径和问题_第1张图片

再看:

[DP题解]矩阵最小路径和问题_第2张图片

例如:

[DP题解]矩阵最小路径和问题_第3张图片

由此进行算法设计:

 注意:下面代码中的矩阵是通过随机数生成的。(与分析过程中的实例矩阵数值不同)

package com.bean.algorithmexec;

public class MatrixPath {
	/*
	 * 给定一个矩阵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。
	 * */

	/*
	 * 计算方法
	 * */
	
	public static int minPathSum(int [][] m) {
		
		if(m==null || m.length==0 || m[0]==null || m[0].length ==0) {
			return 0;
		}
		
		int row=m.length;
		int col=m[0].length;
		int[][] dp=new int[row][col];
		dp[0][0] = m[0][0];
		
		for(int i=1;i结果可以自己来分析~

6	9	4	10	
5	4	6	3	
1	3	5	7	
9	6	4	3	
sum = 27

上面的算法设计中,矩阵一共有M*N个位置,每个位置都计算一次从(0,0)位置到达自己的最小路径和,计算的时候只是比较上边位置的最小路径与左边位置的最小路径和哪个更小,所以时间复杂度为O(M*N),dp矩阵的大小为M*N,所以额外空间复杂度为O(M*N)。


动态规划算法

public static int minPathSum(int [][] m) {
		
		if(m==null || m.length==0 || m[0]==null || m[0].length ==0) {
			return 0;
		}
		
		int row=m.length;
		int col=m[0].length;
		int[][] dp=new int[row][col];
		dp[0][0] = m[0][0];
		
		for(int i=1;i

LeetCode提交之后,Accepted!

[DP题解]矩阵最小路径和问题_第4张图片

 


上面的DP算法过程还可以在进一步进行优化。

后续补充。

 

你可能感兴趣的:(算法分析与设计,DP动态规划)