【前端er每日算法】动态规划--不同路径问题

78 阅读1分钟

题目一 62. 不同路径

思路

  1. dp[i][j]: 代表从dp[0][0]出发到该节点的路径总数
  2. 初始化:第一行,第一列都只有一种方案,不停的向右或者向下走,所以初始化为第一行第一列都是1
  3. 递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]
  4. 循环顺序:二维数组循环遍历,从1开始
var uniquePaths = function(m, n) {
    const dp = new Array(m).fill(0).map(item => new Array(n).fill(0));
    for (let j = 0; j < n; j++) {
        dp[0][j] = 1;
    }
    for (let i = 0; i < m; i++) {
        dp[i][0] = 1;
    }
    for (let i = 1; i < m; i++) {
        for (let j = 1; j < n; j++) {
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        }
    }
    return dp[m - 1][n - 1];
};

题目二 63. 不同路径 II

思路

和上一题类似,但是本题增加的条件是,有障碍物,所以要处理有障碍物的情况

  1. 二维数组都初始化为0
  2. dp[i][j]: 代表从dp[0][0]出发到该节点的路径总数
  3. 初始化:第一行,第一列,不停的向右或者向下走,正常的话是1种方案,但是因为可能遇到障碍物,如果遇到障碍物会导致无法到达后续的格子,所以变为障碍物前面都是可以到达的,且一种方案,障碍物后面的不可到达为0
  4. 递推公式:如果不是障碍物的情况下才有这个递推公式,障碍物需要跳过 dp[i][j] = dp[i-1][j] + dp[i][j-1]
  5. 循环顺序:二维数组循环遍历,从1开始
var uniquePathsWithObstacles = function(obstacleGrid) {
    const m = obstacleGrid.length;
    const n = obstacleGrid[0].length;
    const dp = new Array(m).fill(0).map(item => new Array(n).fill(0));
    // 初始化
    for (let i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
        dp[i][0] = 1;
    }
    for (let j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
        dp[0][j] = 1;
    }
    for (let i = 1; i < m; i++) {
        for (let j = 1; j < n; j++) {
            if (obstacleGrid[i][j] !== 1) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
    }
    return dp[m-1][n-1];
};