和62题类似,增加了障碍物
递推方程变为:
当(i, j) 为障碍物时:DP(i, j) = 0;
当(i, j)不是障碍物时:DP(i, j) = DP(i-1, j) + DP(i, j-1);
注意第一列和第一行初始化的处理;比如第一行,只要前面有障碍物,后面的所有走法都是0
解法如下
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int[][] dp = new int[obstacleGrid.length][obstacleGrid[0].length];
boolean flagx = false;
for(int i=0; i<obstacleGrid.length; i++) {
if(obstacleGrid[i][0]==1 || flagx) {
flagx = true;
dp[i][0] = 0;
} else {
dp[i][0] = 1;
}
}
boolean flagy = false;
for(int j=0; j<obstacleGrid[0].length; j++) {
if(obstacleGrid[0][j]==1 || flagy) {
flagy = true;
dp[0][j] = 0;
} else {
dp[0][j] = 1;
}
}
for(int i=1; i<obstacleGrid.length; i++) {
for(int j=1; j<obstacleGrid[0].length; j++) {
if(obstacleGrid[i][j]==1) {
dp[i][j] = 0;
} else {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[obstacleGrid.length-1][obstacleGrid[0].length-1];
}