leetcode 63.不同路径ii(unique paths ii)c语言

leetcode 63.不同路径ii(unique paths ii)c语言

    • 1.description
    • 2.solution

1.description

https://leetcode-cn.com/problems/unique-paths-ii/description/

一个机器人位于一个 obstacleGridSize x *obstacleGridColSize 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

说明:m 和 *obstacleGridColSize 的值均不超过 100。

示例 1:

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

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

2.solution

和62题状态方程相同,不同的是,在有障碍物处将dp值设为0即可,当然初始化时也有所不同,第一行和第一列比较特殊,分别只能向右和向下走,所以一旦遇到障碍物,后边的格子也不可达。

int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
    int **dp = (int**)malloc(obstacleGridSize*sizeof(int*));
    for(int i=0; i<obstacleGridSize; ++i){
        dp[i] = (int*)malloc(*obstacleGridColSize*sizeof(int));
    }

    // 更加简洁的初始化
    dp[0][0] = 1 - obstacleGrid[0][0];
    // 初始化第一行
    for(int i=1; i<*obstacleGridColSize; ++i){
        dp[0][i] = (obstacleGrid[0][i] || dp[0][i-1]==0) ? 0 : 1;
    }

    // 初始化第一列
    for(int i=1; i<obstacleGridSize; ++i){
        dp[i][0] = (obstacleGrid[i][0] || dp[i-1][0]==0) ? 0 : 1;
    }

    for(int i=1; i<obstacleGridSize; ++i){
        for(int j=1; j<*obstacleGridColSize; ++j){
            if(obstacleGrid[i][j] == 1){
                dp[i][j] = 0;
            }else{
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
    }

    return dp[obstacleGridSize-1][*obstacleGridColSize-1];
}

你可能感兴趣的:(leetcode,动态规划)