A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).
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.
Note: m and n will be at most 100.
Example 1:
Input:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
Output: 2
Explanation:
There is one obstacle in the middle of the 3x3 grid above.
There are two ways to reach the bottom-right corner:
1. Right -> Right -> Down -> Down
2. Down -> Down -> Right -> Right
思路:这道题的简单版思路戳下面链接
LeetCode.62:Unique Paths【DP】
增加了一个障碍物说法
在之前的代码上稍作修改即可,如果第一行出现障碍,那么障碍物那一格包括后面的都走不通了,都为0。同理,如果第一列出现障碍,那么障碍物那一格包括下面的也都走不通了,都为0。没有障碍物出现则为1。
如果第i行第j列出现障碍(i>1,j>1),则把这一格赋为0。
其他情况则是第i行第j列等于这一格的上边一格和左边一格之和。即dp[i][j]=dp[i-1][j]+dp[i][j-1];
package com.wanghao;
public class UniquePathsII {
public static void main(String[] args) {
UniquePathsII uniquePathsII=new UniquePathsII();
int[][] obstacleGrid= {{0,0,0},{0,1,0},{0,0,0}};
System.out.println(uniquePathsII.uniquePathsWithObstacles(obstacleGrid));
}
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m=obstacleGrid.length;
int n=obstacleGrid[0].length;
int dp[][]=new int[m+1][n+1];
if (obstacleGrid[0][0] == 1) {
return 0;
}
else {
dp[0][0]=1;
}
for (int i = 1; i < n; i++) {
if (obstacleGrid[0][i]==1) {
break;
}
else {
dp[0][i]=1;
}
}
for (int j = 1; j < m; j++) {
if (obstacleGrid[j][0]==1) {
break;
}
else {
dp[j][0]=1;
}
}
for (int i = 1; i <m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j]==1) {
dp[i][j]=0;
}
else {
dp[i][j]=dp[i][j-1]+dp[i-1][j];
}
}
}
return dp[m-1][n-1];
}
}