LeetCode[63] 不同路径 II(DP)

本题目为 不同路径 扩展题,区别在于增添有障碍物的情况。

题目描述

一个机器人位于一个 m x n 网格的左上角(起始点为图中的 “Start”),机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
不同路径 II
说明:m 和 n 的值均不超过 100。

示例 1:

输入: [ [0,0,0], [0,1,0], [0,0,0] ]
输出: 2

解释: 3x3 网格的正中间有一个障碍物,从左上角到右下角一共有 2 条不同的路径:

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

题解思路

实现思路与 不同路径 一样,使用动态规划求解。区别在于求状态值时需要判断当前坐标是否有障碍物,如果有障碍物,当前状态值为 0。其状态转移方程如下:

  • (0, 0) 处有障碍物,return 0,无法到达
  • i == 0 && j == 0,status[i][j] = 1
  • i == 0 && j != 0,status[i][j] = 判断有障碍物 ? 0 : status[i][j - 1]
  • i != 0 && j == 0,status[i][j] = 判断有障碍物 ? 0 : status[i - 1][j]
  • i != 0 && j != 0,status[i][j] = 判断有障碍物 ? 0 : status[i - 1][j] + status[i][j - 1]

代码实现

int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
    if(obstacleGrid[0][0] == 1) {
        return 0;
    }
    long **status = (long **)malloc(sizeof(long *) * obstacleGridSize);
    int i, j;
    for(i = 0; i < obstacleGridSize; i++) {
        status[i] = (long *)malloc(sizeof(long) * (*obstacleGridColSize));
        memset(status[i], 0, *obstacleGridColSize);
    }
    for(i = 0; i < obstacleGridSize; i++) {
        for(j = 0; j < *obstacleGridColSize; j++) {
            if(i == 0 && j == 0) {
                status[i][j] = 1;
            }
            else if(i == 0 && j != 0) {
                status[i][j] = (obstacleGrid[i][j] == 1) ? 0 : status[i][j - 1];
            }
            else if(i != 0 && j == 0) {
                status[i][j] = (obstacleGrid[i][j] == 1) ? 0 : status[i - 1][j];
            }
            else {
                status[i][j] = (obstacleGrid[i][j] == 1) ? 0 : status[i - 1][j] + status[i][j - 1];
            }
        }
    }
    return status[obstacleGridSize - 1][*obstacleGridColSize - 1];
}
posted @ 2020-04-18 23:18  Caso_卡索  阅读(97)  评论(0编辑  收藏  举报