Skip to content

0064 最小路径和

算法思路

很容易想到,这是动态规划。由于存在相同子问题,我们走到点 gris[i][j] 的最短距离,仅与走到 grid[i-1][j]grid[i][j-1] 的最短距离相关(i, j > 0)。

易得状态转移方程:

\[ \displaystyle minPath[i][j] = \left \{ \begin{array}{cc} \min (minPath[i-1][j],minPath[i][j-1])+grid[i][j] & \text{i, j > 0}\\ minPath[0][j-1]+grid[i][j] & \text{i = 0}\\ minPath[i-1][0]+grid[i][j] & \text{j = 0} \end{array} \right. \]

并且有 \(minPath[0][0]=grid[0][0]\)

代码实现

minimum-path-sum.c
#define min(a, b) ((b) < (a) ? (b) : (a))

int minPathSum(int** grid, int gridSize, int* gridColSize) {
    int ret[gridSize][gridColSize[0]];
    memset(ret, 0, gridSize * gridColSize[0] * sizeof(int));
    ret[0][0] = grid[0][0];
    for (int i = 1; i < gridSize; i++) {
        ret[i][0] = ret[i - 1][0] + grid[i][0];
    }
    for (int i = 1; i < gridColSize[0]; i++) {
        ret[0][i] = ret[0][i - 1] + grid[0][i];
    }
    for (int i = 1; i < gridSize; i++) {
        for (int j = 1; j < gridColSize[0]; j++) {
            // int minPath = 1e8, more = grid[i][j];
            // minPath = min(minPath, ret[i - 1][j] + grid[i][j]);
            // for (int index = j - 1; index >= 0; index--) {
            //     minPath = min(minPath, ret[i][index] + more);
            //     more += grid[i][index];
            // }
            ret[i][j] = min(ret[i - 1][j], ret[i][j - 1]) + grid[i][j];
        }
    }
    return ret[gridSize - 1][gridColSize[0] - 1];
}