【Leetcode】64. 最小路径和

47 阅读1分钟

leetcode-64.png

对于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];
};