美文网首页动态规划
dp优化:二维数组化为一维数组

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

作者: 7ccc099f4608 | 来源:发表于2020-02-27 16:21 被阅读0次

均是二维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];
    }

相关文章

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

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

  • 排位赛 13 题解

    排位赛 13 题解 题型 A - 贪心 √ B - 后缀数组 √ C - 环形DP D - 二维树状数组/二维线段...

  • 解决动态规划问题的思路

    1. 根据题目含义来构造一个DP数组,二维数组或者一维数组。 2. 确定初始化条件,用来初始化DP数组。 3. 找...

  • php二维数组转化为字符串

    php二维数组转化为字符串 //二维数组转化为字符串,中间用,隔开 functionarr_to_str($arr...

  • numpy -- numpy高阶应用

    numpy高阶应用 随机数 数组重塑 将一维数组转化为二维数组 获取维度信息并应用 数组拉平 数组连接 数组拆分 ...

  • js数组reduce高级应用

    计算数组中每个元素出现的次数 数组去重 将二维数组转化为一维 将多维数组转化为一维 对象里的属性求和 原文链接: ...

  • 类数组转化为数组

    模拟内置slice实现数组克隆 优化类数组转数组的代码:借用数组原型上的slice方法,将arguments转化为...

  • LeetCode 动态规划L1

    开二维数组dp[][] 且i与j下标都从1开始: vectordp(len1+1,vector ...

  • DP训练——树状数组优化DP

    树状数组DP BZOJ1264题意给出两个长度均为的数字序列,求。数据保证每个序列中,到共个数字每个必然出现次。题...

  • Day08

    二维数组 二维数组格式 二维数组初始化 二维数组的遍历 二维数组内存存储细节 二维数组与函数注意点: 主要是看函数...

网友评论

    本文标题:dp优化:二维数组化为一维数组

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