class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
if (obstacleGrid[0][0] == 1) return 0;
vector<vector<long long>> dp(obstacleGrid.size(), vector<long long>(obstacleGrid[0].size(), 1));
for (int i=1; i<obstacleGrid[0].size(); i++) {
if (obstacleGrid[0][i] == 1) dp[0][i] = 0;
else dp[0][i] = dp[0][i-1];
}
for (int i=1; i<obstacleGrid.size(); i++){
dp[i][0] = obstacleGrid[i][0]==1? 0: dp[i-1][0];
for (int j=1; j<obstacleGrid[i].size(); j++){
dp[i][j] = obstacleGrid[i][j]==1? 0: dp[i-1][j] + dp[i][j-1];
}
}
return dp.back().back();
}
};