LeetCode ---- 64、最小路径和

题目链接

思路:

此题使用动态规划。因为走的每一步都需要参考前面走的位置,选出最小和。

当前所处位置(i,j)的总和,等于     走到上面格子(i - 1,j)的总和     

                                                  与      走到左边格子(i,j - 1)的总和       的最小值   

                                                 加上      当前所处位置的数字。

动态方程为:dp[ i ][ j ] = Math.min( dp[ i - 1 ][ j ], dp[ i ] [ j - 1] ) + grid[ i ][ j ]; 

题目所给grid  第一行,只能都往右走,第一列,只能都往下走。

即:  dp[ i ][ 0 ] = dp[ i - 1 ][ 0 ] + grid[ i ][ 0 ];
         dp[ 0 ][ j ] = dp[ 0 ][ j - 1 ] + grid[ 0 ][ j ];

    public int minPathSum(int[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0) {
            return 0;
        }
        int m = grid.length;
        int n = grid[0].length;
        int[][] dp = new int[m][n];
        dp[0][0] = grid[0][0];
        for (int i = 1; i < m; i++) {   // 第一列只能往下走
            dp[i][0] = dp[i - 1][0] + grid[i][0];
        }
        for (int j = 1; j < n; j++) {  // 第一行只能往右走
            dp[0][j] = dp[0][j - 1] + grid[0][j];
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                // 计算当前位置的最小总和,从上面和左边挑一个来走到当前位置,挑总和最小的即可
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }
        return dp[m - 1][n - 1];
    }

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/106844265