但是多了阻碍物
很容易想到 状态转移方程多了一个条件 即:
只在ob[i][j]==0时进行转移
dp[i][j]=dp[i-1][j]+dp[i][j-1];
但容易忽略的是 如果边界和起点也会出现阻碍物
1:起点出现阻碍物 直接返回0;
2:边界出现阻碍物 那么该点和该点后面的边界状态转移都为0
原始网格矩阵:
0 | 0 | 0 |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 0 | 0 |
对应初始状态转移矩阵
1 | 1 | 1 |
1 | x | x |
0 | x | x |
0 | x | x |
x是待求转态
for(int i=0;i<m;i++){
if(obstacleGrid[i][0]!=1){//通时
dp[i][0]=1;
}else{
break;
}
}
for(int j=0;j<n;j++){
if(obstacleGrid[0][j]!=1){
dp[0][j]=1;
}else{
break;
}
}
代码:
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
if(obstacleGrid[0][0]==1) return 0;
int m=obstacleGrid.length;
int n=obstacleGrid[0].length;
int[][] dp=new int[m][n];
for(int i=0;i<m;i++){
if(obstacleGrid[i][0]!=1){//通时
dp[i][0]=1;
}else{
break;
}
}
for(int j=0;j<n;j++){
if(obstacleGrid[0][j]!=1){
dp[0][j]=1;
}else{
break;
}
}
//阻碍物会把路堵死
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(obstacleGrid[i][j]!=1){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}