/**
* Follow up for "Unique Paths":
*
* Now consider if some obstacles are added to the grids. How many unique paths
* would there be?
*
* An obstacle and empty space is marked as 1 and 0 respectively in the grid.
*
* For example,
* There is one obstacle in the middle of a 3x3 grid as illustrated below.
*
* [
* [0,0,0],
* [0,1,0],
* [0,0,0]
* ]
* The total number of unique paths is 2.
*
* Note: m and n will be at most 100.
*
* Tags: Array, DP
*/
class UniquePaths2 {
public static void main(String[] args) {
int[][] obstacleGrid = new int[3][3];
obstacleGrid[1][1] = 1;
System.out.println(uniquePathsWithObstacles(obstacleGrid));
}
/**
* DP, bottom-up approach
* build from end point to start point
* for the grid paths at the rth row and cth column
* paths[r][c] = obstacleGrid[r][c] == 1 ? 0
* : paths[r + 1][c] + paths[r][c + 1];
*/
public static int uniquePathsWithObstacles(int[][] obstacleGrid) {
if (obstacleGrid == null) return 0;
int m = obstacleGrid.length;
if (m == 0) return 0;
int n = obstacleGrid[0].length;
int[][] paths = new int[m + 1][n + 1];
paths[m - 1][n] = 1;
for (int r = m - 1; r >= 0; r--) {
for (int c = n - 1; c >= 0; c--) {
paths[r][c] = obstacleGrid[r][c] == 1 ? 0 : paths[r + 1][c] + paths[r][c + 1];
}
}
return paths[0][0];
}
}