int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
if (m == 0) {
return 0;
}
int n = obstacleGrid[0].size();
vector<vector<int>> dp(2,vector<int>(n));
dp[0][0] = obstacleGrid[0][0] == 0;
for (int i = 1; i < n; i++) {
dp[0][i] = obstacleGrid[0][i] == 0 ? dp[0][i - 1] : 0;
}
int pre = 0, cur = 1;
for (int i = 1; i < m; i++) {
dp[cur][0] = obstacleGrid[i][0] == 0 ? dp[pre][0] : 0;
for (int j = 1; j < n; j++) {
dp[cur][j] = obstacleGrid[i][j] == 0 ? dp[cur][j - 1] + dp[pre][j] : 0;
}
swap(cur, pre);
}
return dp[pre][n - 1];
}