最小路径
此博客链接:https://www.cnblogs.com/ping2yingshi/p/13772894.html
最小路径和
题目链接:https://leetcode-cn.com/problems/minimum-path-sum/
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
题解:
设sum(a,b)表示当前值所求得的最大路径和,a(a,b)表示每个格的当前值。
思路:当我们到达右下角时,此时可以有两种方式到达右下角,一种是从上面到达右下角,还有一种是从左侧到达右下角,求的是路径最小值,所以我们应该取两者之间小的值,加上右下角的值作为最后的结果。此时,sum(3,3)=min(sum(2,3)+sum(3,2))+a(3,3)
通项公式是: sum(m,n)=min(sum(m-1,n),sum(m,n-1))+a(m,n),
初始条件是: sum(0,0)=a(0,0)
注意:边界条件:在第一行,第一列的网格是不符合通项公式的,在第一行时,sum(1,n)=sum(1,n-1)+a(1,n),第一列时,sum(m,1)=sum(m-1,n)+a(m,1)
代码:
class Solution { public int minPathSum(int[][] grid) { int hang=grid.length; int lie=grid[0].length; int [][] sum=new int [hang][lie]; sum[0][0]=grid[0][0]; for(int i=1;i<lie;i++) { sum[0][i]=sum[0][i-1]+grid[0][i]; } for(int i=1;i<hang;i++) { sum[i][0]=sum[i-1][0]+grid[i][0]; } for(int i=1;i<hang;i++) for(int j=1;j<lie;j++) { sum[i][j]=Math.min(sum[i-1][j],sum[i][j-1])+grid[i][j]; } return sum[hang-1][lie-1]; } }
出来混总是要还的