动态规划

dp优化:二维数组化为一维数组

2020-02-27  本文已影响0人  7ccc099f4608

均是二维dp数组,但是通过列赋初始值后,能够优化为一维数组,通记忆上一个状态,达到二维数组的目的

  1. Unique Paths_62
  2. MinimumPathSum_64
  3. UniquePaths_2_63

1。 最简单的方式是无脑使用二维数组记录状态,然后做比较 dp[i-1][j] 和 dp[i][j-1]
2。 可优化成一维数组,通过比较 本周期前一状态(环比) dp[i-1] 和 上一周期同一状态(同比) dp[i]


对于二维dp数组,无脑比较,加上题目所给grid的值即可做出,无加赘述。


对于一维dp数组,可以采取:
1。 row向:
int[] dp = new int[rowL]
double for遍历grid时:
对 row 的遍历放在内层;
遍历从(1,1)开始;
如果要考虑(0,x)的值,在外层遍历单独考虑

2。 col向:
int[] dp = new int[colL]
double for遍历grid时:
对 col 的遍历放在内层;
遍历从(1,1)开始;
如果要考虑的值,(x,0)在外层遍历单独考虑

举例:
UniquePaths_2_63
1。 row向:

public int uniquePathsWithObstacles1(int[][] obstacleGrid) {
        int rowL = obstacleGrid.length;
        int colL = obstacleGrid[0].length;

        int[] dp = new int[rowL];
        // 初始化
        for(int i=0; i<rowL; i++) {
            if(obstacleGrid[i][0] != 0) {
                dp[i] = 0;
                break;
            }

            dp[i] = 1;
        }

        // 遍历grid
        for (int j=1; j<colL; j++) {
            if(obstacleGrid[0][j] != 0) {  // grid边缘处理
                dp[0] = 0;
            }
            for (int i=1; i < rowL; i++) {
                if (obstacleGrid[i][j] != 0) {
                    dp[i] = 0;
                } else { // j > 0 if (dp[i - 1] != 0)
                    dp[i] += dp[i - 1];
                }
            }
        }

        return dp[rowL - 1];
    }

2。 col向:

public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int rowL = obstacleGrid.length;
        int colL = obstacleGrid[0].length;

        int[] dp = new int[colL];
        for(int j=0; j<colL; j++) {
            if(obstacleGrid[0][j] != 0) {
                dp[j] = 0;
                break;
            }

            dp[j] = 1;
        }


        for (int i=1; i<rowL; i++) {
            if(obstacleGrid[i][0] != 0) {
                dp[0] = 0;
            }
            for (int j=1; j < colL; j++) {
                if (obstacleGrid[i][j] != 0) {
                    dp[j] = 0;
                } else { // j > 0
                    dp[j] += dp[j - 1];
                }
            }
        }

        return dp[colL - 1];
    }
上一篇 下一篇

猜你喜欢

热点阅读