这道题跟三角形最小路径和类似
题目描述
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
思想
这是一道二维数组的动态规划题目, 左边表示输入, 右边表示dp 结果集
- 第一行只能够向右走, 所以
dp[i][j] = grid[i][j] + dp[i][j - 1];
- 第一列只能向下走,所以
dp[i][j] = grid[i][j] + dp[i - 1][j]
- 其余符合
dp[i][j] = grid[i][j] + Math.min(dp[i - 1][j], dp[i][j - 1])
;
输入
i / k | k = 0 | k = 1 | k = 2 |
---|---|---|---|
i = 0 | 1 | 3 | 1 |
i = 1 | 1 | 5 | 1 |
i = 2 | 4 | 2 | 1 |
dp结果集
i / k | k = 0 | k = 1 | k = 2 |
---|---|---|---|
i = 0 | 1 | 4 | 5 |
i = 1 | 2 | 7 (上面dp值与左边dp值比较取最小 + grid) | 6 |
i = 2 | 6 | 8 | 7 |
代码
/**
* 二维数组的动态规划
* 当前 dp[i][j] = grid[i][j] + Math.min(dp[i - 1][j], dp[i][j - 1]);
* 第一行只能够向右走, 所以 dp[i][j] = grid[i][j] + dp[i][j - 1];
* 第一列只能向下走,所以 dp[i][j] = grid[i][j] + dp[i - 1][j]
*/
var minPathSum = function(grid) {
let rows = grid.length;
let columns = grid[0].length;
let dp = [];
for(let i = 0; i < rows; i++) {
let temp = [];
for(let j = 0; j < columns; j++) {
if(i == 0 && j == 0) {
temp.push(grid[i][j]);
} else if(j == 0) {
temp.push(grid[i][j] + dp[i - 1][j]);
} else if(i == 0) {
temp.push(grid[i][j] + temp[j - 1])
} else {
temp.push(grid[i][j] + Math.min(dp[i - 1][j], temp[j - 1]))
}
}
dp.push(temp);
}
return dp[rows - 1][columns - 1]
};