Skip to content

dp递归, m[x][y] = min(dfs(x-1, y), dfs(x, y-1)) + grid[x][y]; 注意: 对于dfs(0, 0)需要特殊处理, 返回零, 不然会因为dfs(0, -1)和dfs(-1, 0)都为Integer.MAX_VALUE导致错误 @param grid @return

java
class Solution {
    int[][] m;

    /**
     * dp递归,
     *  m[x][y] = min(dfs(x-1, y), dfs(x, y-1)) + grid[x][y];
     * 注意: 对于dfs(0, 0)需要特殊处理, 返回零,
     * 不然会因为dfs(0, -1)和dfs(-1, 0)都为Integer.MAX_VALUE导致错误
     * @param grid
     * @return
     */
    public int minPathSum(int[][] grid) {
        m = new int[grid.length][grid[0].length];
        for (var row : m) {
            Arrays.fill(row, -1);
        }
        return dfs(grid, grid.length-1, grid[0].length-1);
    }

    /**
     * dfs(x, y): 从(x, y)的方向出发, 最后到达(0, 0), 路径的数字总和的最小值
     */
    private int dfs(int[][] grid, int x, int y) {
        if (x < 0 || y < 0) {
            return Integer.MAX_VALUE;
        }
        if (x == 0 && y == 0) return grid[0][0];
        if (m[x][y] != -1) return m[x][y];

        m[x][y] = Math.min(dfs(grid, x-1, y), dfs(grid, x, y-1)) + grid[x][y];

        return m[x][y];
    }
}

Personal Knowledge Base