dp[i][j] 表示从左上角开始到 (i, j) 位置的最 优路径的数字和

首先先不要考虑空间压缩

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int n = grid.size(), m = grid[0].size();
        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < m; j ++) {
                if (i == 0 && j == 0) continue;
                else if (i == 0) grid[i][j] += grid[i][j - 1];
                else if (j == 0) grid[i][j] += grid[i - 1][j];
                else grid[i][j] += min(grid[i - 1][j], grid[i][j - 1]);
            }
        }
        return grid[n - 1][m - 1];
    }
};

因为 dp 数组是按行从左到右遍历的,处理下一行时上一行的数据都已经处理完,所以可以直接在上一行上处理数据。也就说只需要只需要一行就可以了,二维数组可以压缩为一维数组。

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int n = grid.size(), m = grid[0].size();
        vector<int> f(m);
        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < m; j ++) {
                if (i == 0 && j == 0) f[j] = grid[i][j];
                else if (!i) f[j] = grid[i][j] + f[j - 1];
                else if (!j) f[j] = grid[i][j] + f[j];
                else f[j] = grid[i][j] + min(f[j], f[j - 1]);
            }
        }
        return f[m - 1];
    }
};