给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
思路
dp[i][j]代表到达(i,j)位置的最小路径和,到达该位置的上一步,只能是(i - 1,j) 或 (i,j - 1),只要知道
dp[i - 1][j], dp[i][j - 1]的值,并比较哪个最小,在加上(i,j)位置的数,则可求出最小路径和。
动态转移公式为
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
class Solution {
public int minPathSum(int[][] grid) {
int r = grid.length;
int c = grid[0].length;
int[][] dp = new int[r][c];
dp[0][0] = grid[0][0];
//第一行每格的最小路径和
for (int i = 1; i < r; i++) {
dp[i][0] = dp[i - 1][0] + grid[i][0] ;
}
//第一列每格的最小路径和
for (int j = 1; j < c; j++) {
dp[0][j] = dp[0][j - 1] + grid[0][j];
}
//dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
for (int i = 1; i < r; i++) {
for (int j = 1; j < c; j++) {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[r - 1][c - 1];
}
}
网友评论