对于DP类问题,最重要的是反推
比如说这里的要求,要知道最后的最小值,那么就衍生到倒数第二次的最小值...倒数第n次的最小值,第二次的最小值
怎么求第二次的最小值呢,第二次也就两个情况,也就是dp[0][1]以及dp[1][0]
dp[0][0] = grid[0][0]
dp[0][1] = dp[0][0] + grid[0][1]
dp[1][0] = dp[0][0] + grid[1][0]
// 递推式
dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
对于边界上的值,只有一种可能,就是边界的累加
dp[0][j] = dp[0][j-1] + grid[0][j] // 第一行
dp[i][0] = dp[i-1][0] + grid[i][0] // 第一列
DP
var minPathSum = function (grid) {
let row = grid.length;
let col = grid[0].length;
let dp = new Array(row).fill(0).map(() => []);
dp[0][0] = grid[0][0];
for (let i = 1; i < col; ++i) {
dp[0][i] = dp[0][i - 1] + grid[0][i];
}
for (let i = 1; i < row; ++i) {
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for (let i = 1; i < row; ++i) {
for (let j = 1; j < col; ++j) {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[row - 1][col - 1];
};