// Recursion 大数据集无法通过
class Solution {
private:
int _count;
public:
int uniquePathsWithObstacles(vector<vector<int> > &grid) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
_count = 0;
dfs(grid, 0, 0);
return _count;
}
void dfs(vector<vector<int> > &grid, int i, int j)
{
int r = grid.size();
int c = grid[0].size();
if (i == r || i < 0 || j == c || j < 0)
return;
if (grid[i][j] == 1)
return;
else
{
if (i == r - 1 && j == c - 1)
{
++_count;
return;
}
else
{
dfs(grid, i + 1, j);
dfs(grid, i, j + 1);
}
}
}
};
// DP
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &grid) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (grid.size() == 0) return 0;
int r = grid.size();
int c = grid[0].size();
if (grid[r - 1][c - 1] == 1 || grid[0][0] == 1)
return 0;
int mat[105][105];
mat[r - 1][c - 1] = 1;
for (int i = c - 2; i >= 0; --i)
{
if (grid[r - 1][i] == 1)
mat[r - 1][i] = 0;
else
mat[r - 1][i] = mat[r - 1][i + 1];
}
for (int i = r - 2; i >= 0; --i)
{
if (grid[i][c - 1] == 1)
mat[i][c - 1] = 0;
else
mat[i][c - 1] = mat[i + 1][c - 1];
}
for (int i = r - 2; i >= 0; --i)
{
for (int j = c - 2; j >= 0; --j)
{
if (grid[i][j] == 0)
mat[i][j] = mat[i + 1][j] + mat[i][j + 1];
else
mat[i][j] = 0;
}
}
return mat[0][0];
}
};