LeetCode 63. 不同路径 II
暴力会超时
记忆化搜索
const int N = 110;
class Solution {
public:
int f[N][N];
int n, m;
int dfs(int x, int y, vector<vector<int>>& g)
{
if(f[x][y]) return f[x][y];
if(g[x][y] == 1)
{
f[x][y] = 0;
return f[x][y];
}
if(n - 1 == x && y == m - 1)
{
f[x][y] = 1;
return f[x][y];
}
int res1 = 0, res2 = 0;
if(x + 1 < n && g[x + 1][y] == 0)
f[x + 1][y] = dfs(x + 1, y, g);
if(y + 1 < m && g[x][y + 1] == 0)
f[x][y + 1] = dfs(x, y + 1, g);
return f[x][y + 1]+ f[x + 1][y];
}
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
n = obstacleGrid.size(), m = obstacleGrid[0].size();
return dfs(0, 0,obstacleGrid);
}
};
经典DP
const int N = 110;
class Solution {
public:
int f[N][N];
int uniquePathsWithObstacles(vector<vector<int>>& g) {
int n = g.size(), m = g[0].size();
f[0][0] = 1;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
{
if(g[i][j] == 1)
f[i][j] = 0;
if(g[i][j] == 0 && j - 1 >= 0)
f[i][j] += f[i][j - 1];
if(g[i][j] == 0 && i - 1 >= 0)
f[i][j] += f[i - 1][j];
}
return f[n - 1][m - 1];
}
};