难度中等
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
解法1:动态规划
public int minPathSum(int[][] grid) {
int rows = grid.length;
int cols = grid[0].length;
// dpArr[i][j]: 代表走到(i, j)的最小路径和
int[][] dpArr = new int[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
// 起点
if (i == 0 && j == 0) {
dpArr[i][j] = grid[i][j];
}
// 只能从左边来 (第0行)
if (i == 0 && j != 0) {
dpArr[i][j] = dpArr[i][j - 1] + grid[i][j];
}
// 只能从上边来 (第0列)
if (i != 0 && j == 0) {
dpArr[i][j] = dpArr[i - 1][j] + grid[i][j];
}
// 可从上边来,也可从左边来,取最小值
if (i != 0 && j != 0) {
dpArr[i][j] = Math.min(dpArr[i - 1][j], dpArr[i][j - 1]) + grid[i][j];
}
}
}
return dpArr[rows - 1][cols - 1];
}