美文网首页
最小路径和 -dp

最小路径和 -dp

作者: fdsun | 来源:发表于2020-06-04 10:14 被阅读0次

给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。

样例
样例 1:
输入: [[1,3,1],[1,5,1],[4,2,1]]
输出: 7
样例解释:
路线为: 1 -> 3 -> 1 -> 1 -> 1。

样例 2:
输入: [[1,3,2]]
输出: 6
解释:
路线是: 1 -> 3 -> 2

注意事项
你在同一时间只能向下或者向右移动一步

    /**
     * f[i][j] 表示走到(i,j)的最小和
     * <p>
     * f[i][j] = min{f[i-1][j],f[i][j-1]}+A[i][j]
     *
     * @param grid: a list of lists of integers
     * @return: An integer, minimizes the sum of all numbers along its path
     */
    public int minPathSum(int[][] grid) {
        // write your code here
        int m = grid.length;
        if (m == 0) {
            return 0;
        }

        int n = grid[0].length;
        if (n == 0) {
            return 0;
        }

        int[][] f = new int[m][n];

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (i == 0 && j == 0) {
                    f[i][j] = grid[i][j];
                    continue;
                }
                int t = Integer.MAX_VALUE;
                if (i > 0) {
                    t = Math.min(t, f[i - 1][j]);
                }

                if (j > 0) {
                    t = Math.min(t, f[i][j - 1]);
                }
                f[i][j] = t + grid[i][j];
            }
        }

        return f[m - 1][n - 1];
    }
    /**
     * f[i][j] 表示走到(i,j)的最小和
     * <p>
     * f[i][j] = min{f[i-1][j],f[i][j-1]}+A[i][j]
     *
     * @param grid: a list of lists of integers
     * @return: An integer, minimizes the sum of all numbers along its path
     */
    public int minPathSum2(int[][] grid) {
        // write your code here
        int m = grid.length;
        if (m == 0) {
            return 0;
        }

        int n = grid[0].length;
        if (n == 0) {
            return 0;
        }

        int[][] f = new int[2][n];
        int old, now = 0;
        for (int i = 0; i < m; i++) {
            old = now;
            now = 1 - now;
            for (int j = 0; j < n; j++) {
                if (i == 0 && j == 0) {
                    f[now][j] = grid[i][j];
                    continue;
                }
                int t = Integer.MAX_VALUE;
                if (i > 0) {
                    t = Math.min(t, f[old][j]);
                }

                if (j > 0) {
                    t = Math.min(t, f[now][j - 1]);
                }
                f[now][j] = t + grid[i][j];
            }
        }

        return f[now][n - 1];
    }

    /**
     * f[i][j] 表示走到(i,j)的最小和
     * <p>
     * f[i][j] = min{f[i-1][j],f[i][j-1]}+A[i][j]
     *
     * @param grid: a list of lists of integers
     * @return: An integer, minimizes the sum of all numbers along its path
     */
    public static int minPathSum3(int[][] grid) {
        // write your code here
        int m = grid.length;
        if (m == 0) {
            return 0;
        }

        int n = grid[0].length;
        if (n == 0) {
            return 0;
        }

        int[][] f = new int[m][n];
        int[][] pi = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (i == 0 && j == 0) {
                    f[i][j] = grid[i][j];
                    continue;
                }
                int t = Integer.MAX_VALUE;
                if (i > 0) {
                    t = Math.min(t, f[i - 1][j]);
                    if (t == f[i - 1][j]) {
                        pi[i][j] = 0;
                    }
                }

                if (j > 0) {
                    t = Math.min(t, f[i][j - 1]);
                    if (t == f[i][j - 1]) {
                        pi[i][j] = 1;
                    }
                }
                f[i][j] = t + grid[i][j];
            }
        }

        int[] path = new int[m + n - 1];
        int x = m - 1, y = n - 1;
        for (int i = 0; i < m + n - 1; i++) {
            path[i] = grid[x][y];
            if (pi[x][y] == 0) {
                x--;
            } else {
                y--;
            }
        }

        for (int i = m + n - 2; i >= 0; i--) {
            System.out.println(path[i]);
        }

        return f[m - 1][n - 1];
    }

相关文章

网友评论

      本文标题:最小路径和 -dp

      本文链接:https://www.haomeiwen.com/subject/hzzwzhtx.html