c++
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<int>>dp(m,vector<int>(n,0));//dp[i][j]表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
for(int i = 0;i < m && obstacleGrid[i][0] != 1;i++){//dp数组初始化
dp[i][0] = 1;
}
for(int j = 0;j < n && obstacleGrid[0][j] != 1;j++){
dp[0][j] = 1;
}
for(int i = 1;i < m;i++){
for(int j = 1;j < n;j++){
if(obstacleGrid[i][j] == 1)continue;
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
};
python
class Solution(object):
def uniquePathsWithObstacles(self, obstacleGrid):
"""
:type obstacleGrid: List[List[int]]
:rtype: int
"""
m = len(obstacleGrid)
n = len(obstacleGrid[0])
dp = [[0 for _ in range(n)] for _ in range(m)]
dp[0][0] = 1 if obstacleGrid[0][0] != 1 else 0
if dp[0][0] == 0: return 0 # 如果第一个格子就是障碍,return 0
for i in range(1,m):
if obstacleGrid[i][0] != 1:
dp[i][0] = dp[i-1][0]
for j in range(1,n):
if obstacleGrid[0][j] != 1:
dp[0][j] = dp[0][j-1]
for i in range(1,m):
for j in range(1,n):
if obstacleGrid[i][j] == 1:
continue
dp[i][j] = dp[i-1][j]+dp[i][j-1]
return dp[-1][-1]