题目链接
思路:
此题使用动态规划。因为走的每一步都需要参考前面走的位置,选出最小和。
当前所处位置(i,j)的总和,等于 走到上面格子(i - 1,j)的总和
与 走到左边格子(i,j - 1)的总和 的最小值
加上 当前所处位置的数字。
动态方程为:dp[ i ][ j ] = Math.min( dp[ i - 1 ][ j ], dp[ i ] [ j - 1] ) + grid[ i ][ j ];
题目所给grid 第一行,只能都往右走,第一列,只能都往下走。
即: dp[ i ][ 0 ] = dp[ i - 1 ][ 0 ] + grid[ i ][ 0 ];
dp[ 0 ][ j ] = dp[ 0 ][ j - 1 ] + grid[ 0 ][ j ];
public int minPathSum(int[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
int m = grid.length;
int n = grid[0].length;
int[][] dp = new int[m][n];
dp[0][0] = grid[0][0];
for (int i = 1; i < m; i++) { // 第一列只能往下走
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for (int j = 1; j < n; j++) { // 第一行只能往右走
dp[0][j] = dp[0][j - 1] + grid[0][j];
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
// 计算当前位置的最小总和,从上面和左边挑一个来走到当前位置,挑总和最小的即可
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[m - 1][n - 1];
}