题目:
力扣
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:
输入:grid = [[1,2,3],[4,5,6]]
输出:12
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
题解:
步骤:
1.dp含义
设 dp 为大小 m×n 矩阵,其中 dp[i][j] 的值代表走到 (i,j) 的最小路径和。
2.转移方程
题目要求,只能向右或向下走,换句话说,当前单元格 (i,j) 只能从左方单元格 (i-1,j) 或上方单元格 (i,j-1)走到,因此只需要考虑矩阵左边界和上边界。
具体分为以下 4 种情况:
- 当左边和上边都不是矩阵边界时:dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];即上方单元格与左方单元格最小值和当前单元格之和
- 当只有左边是矩阵边界时: dp[i][j] = dp[i - 1][j] +grid[i][j];即上方单元格与当前单元格之和
- 当只有上边是矩阵边界时:dp[i][j] = dp[i][j - 1] + grid[i][j];即左方单元格与当前单元格之和
- 当左边和上边都是矩阵边界时:dp[i][j] = grid[i][j];其实就是起点
3.初始
dp[][]初始为0
4.遍历方向
从转移方程的分析中得到从左边、上方来,按照从左到右、从上往下的顺序遍历
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 && j == 0) { //当左边和上边都是矩阵边界时,其实就是起点
dp[i][j] = grid[i][j];
} else if (i == 0) { //当只有上边是矩阵边界时
dp[i][j] = dp[i][j - 1] + grid[i][j];
} else if (j == 0) { //当只有左边是矩阵边界时
dp[i][j] = dp[i - 1][j] +grid[i][j];
} else { //当左边和上边都不是矩阵边界时
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
}
return dp[m - 1][n - 1];
}
}
参考:力扣