给定一个矩阵m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置

本文介绍了一种寻找矩阵中从左上角到右下角的最小路径和的算法。通过动态规划方法,逐行计算到达每个节点的最短路径,并最终得出最小路径和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 给定一个矩阵m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置,
 * 路径中所有数字累加起来就是路径和,返回所有路径的最小路径和,如果给定的m如下,那么路径1,3,1,0,6,1,0就是最小路径和,返回12.
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
分析: 对于这个题目,假设m是m行n列的矩阵,那么我们用dp[m][n]来抽象这个问题,
dp[]i]表示的是从原点到i,j位置的最短路径和。我们首先计算第一行和第一列,直接累加即可,
那么对于其他位置,要么是从它左边的位置达到,要么是从上边的位置达到,我们取左边和上边的较小值,然后加上当前的路径值
*/
/*
 得到的公式如下
 m(0,0)            if(i==0 && j==0)
 dp(i,j-1)+m(i,j)  if(i==0)
 dp(i-1,j)+m(i,j)  if(j==0)
 min{dp(i,j-1)+m(i,j),dp(i-1,j)+m(i,j)}  else

 */


public class MaritixMin {
	public static int minDis(int[][] m) {
		int [][] dp = new int[4+1][4+1];
		dp[0][0] = m[0][0];
		for (int i = 1; i < m.length; i++) {
			for (int j = 1; j < m[0].length; j++) {
				if(i==1) {
					dp[i][j] = dp[i][j-1]+m[i][j];
				}else if(j==1) {
					dp[i][j] = dp[i-1][j] +m[i][j];
				}else {
					int temp1 = dp[i][j-1]+m[i][j];
					int temp2 = dp[i-1][j]+m[i][j];
					int min = temp1<temp2?temp1:temp2;
					dp[i][j] = min;
				}
				
			}
			
		}
		
		return dp[m[0].length-1][m.length-1];
	}
	
	public static void main(String[] args) {
		int[][] martix = {{0,0,0,0,0},
						  {0,1,3,5,9},
						  {0,8,1,3,5},
						  {0,5,0,6,1},
						  {0,8,8,4,0}};
		System.out.println("最右下的最短路径为:"+minDis(martix));
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值