此题和leetcode 62题状态转移方程是一样的,但是迁入了障碍物的概念,如果需要知道状态转移方程的思路,可以参考https://blog.csdn.net/qq_41936805/article/details/100179828
解出此题,我们必须知道对于障碍物的特点如下:
- 障碍处的dp值=0
我们已经知道了,动态转移方程为
dp[i][j]=dp[i][j-1]+dp[i-1][j]
接下来就要加入限制条件,如果检测到障碍,就把障碍坐标的dp初始化为0,如果起点dp[0][0]那么dp[1][1]=1,按照思路,加上限制条件就可以了。
然后将下面四种情况考虑一下:
- [[0]]
- [[1]]
- 多行单列有石头
- 单行多列有石头
记录一下碰见的坑,第二次for循环的限制条件不能是j<n了,因为不是每个obstacleGrid[].length是不相同的。
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int [][]dp = new int[m][n];
for(int i = 0; i<m;i++){
for(int j = 0 ; j<obstacleGrid[i].length;j++){
if(obstacleGrid[i][j] == 1){
dp[i][j] = 0;
continue;
}
if(i==0&&j==0){
dp[i][j] = 1;
continue;
}
if(i==0 || j==0){
dp[i][j] = i==0?dp[i][j-1]:dp[i-1][j];
continue;
}
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}