给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
二维dp:
1 public int minPathSum(int[][] grid) { 2 if (grid == null || grid.length == 0 || grid[0].length == 0) { 3 return 0; 4 } 5 int m = grid.length, n = grid[0].length; 6 int[][] dp = new int[m][n]; 7 dp[0][0] = grid[0][0]; 8 for (int i = 0; i < m; i++) { 9 for (int j = 0; j < n; j++) { 10 if (i == 0 && j != 0) { 11 dp[0][j] = dp[0][j - 1] + grid[i][j]; 12 } else if (i != 0 && j == 0) { 13 dp[i][0] = dp[i][i - 1] + grid[i][j]; 14 } else if (i != 0 && j != 0) { 15 dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]; 16 } else { 17 dp[i][j] = grid[i][j]; 18 } 19 } 20 } 21 return dp[m - 1][n - 1]; 22 }
一维dp:
1 public class T64 { 2 public int minPathSum(int[][] grid) { 3 if (grid == null || grid.length == 0 || grid[0].length == 0) { 4 return 0; 5 } 6 int m = grid.length,n = grid[0].length; 7 int[] dp = new int[n]; 8 for (int i = 0; i < m; i++) { 9 for (int j = 0; j < n; j++) { 10 if (i == 0 && j != 0) { 11 dp[j] = dp[j - 1]; 12 } else if (i != 0 && j == 0) { 13 dp[j] = dp[j]; 14 } else if (i != 0 && j != 0) { 15 dp[j] = Math.min(dp[j - 1], dp[j]); 16 } else { 17 dp[j] = 0; 18 } 19 dp[j] = dp[j] + grid[i][j]; 20 } 21 } 22 return dp[n - 1]; 23 } 24 }