给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。
思路:简单DP
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];
当前值=左边与上边较小的值加上当前网格的值
对于边界直接做前缀和

1 int minPathSum(int[][] grid) { 2 int r=grid.length; 3 int c=-1; 4 if(r!=0) 5 c=grid[0].length; 6 7 int [][] dp=new int[r][c]; 8 9 for(int i=0;i<r;i++) 10 { 11 for(int j=0;j<c;j++) 12 { 13 if(i==0&&j==0) 14 dp[i][j]=grid[0][0]; 15 else if(i==0) 16 { 17 dp[i][j]=dp[i][j-1]+grid[i][j]; 18 }else if(j==0) 19 { 20 dp[i][j]=dp[i-1][j]+grid[i][j]; 21 } else { 22 dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]; 23 } 24 } 25 } 26 return dp[r-1][c-1]; 27 28 } 29 private int min(int i, int j) { 30 // TODO Auto-generated method stub 31 if(i<j) 32 return i; 33 else return j; 34 }