class Solution {
public:
int uniquePaths(int m, int n) {
vector<int> v(m, 1);
for(int i = n-2; i >= 0; i--){
for(int j = m-2; j >= 0; j--)
v[j] += v[j+1];
}
return v[0];
}
};
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
if(!obstacleGrid.size()) return 0;
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
if(obstacleGrid[0][0] || obstacleGrid[m-1][n-1]) return 0;
vector<long> dp(n);
dp[n-1] = 1;
for(int i = m-1; i >= 0; i--){
dp[n-1] = obstacleGrid[i][n-1]==1 ? 0 : dp[n-1];
for(int j = n-2; j >= 0; j--){
long d = i==m-1 ? 0 : dp[j];
dp[j] = obstacleGrid[i][j]==1 ? 0 : d+dp[j+1];
}
}
return dp[0];
}
};
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
// if(!grid.size()) return 0;
int m = grid.size(), n = grid[0].size();
for(int i = m-2; i >= 0; i--) grid[i][n-1] += grid[i+1][n-1];
for(int j = n-2; j >= 0; j--) grid[m-1][j] += grid[m-1][j+1];
for(int i = m-2; i >= 0; i--){
for(int j = n-2; j >= 0; j--)
grid[i][j] += min(grid[i][j+1], grid[i+1][j]);
}
return grid[0][0];
}
};