DFS(超時)
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
return dfs(obstacleGrid,0,0);
}
int dfs(vector<vector<int>>& obstacleGrid,int x,int y)
{
if(x==obstacleGrid.size()-1&&y==obstacleGrid[0].size()-1&&obstacleGrid[x][y]==0)
return 1;
if(x>=obstacleGrid.size()||y>=obstacleGrid[0].size()||obstacleGrid[x][y]==1)
return 0;
return dfs(obstacleGrid,x+1,y)+dfs(obstacleGrid,x,y+1);
}
};
DP
對於一個點看左側點和上方點有幾條路徑可以到達。
開一個比obstacleGrid
大一圈的數組處理邊界。
dp[0][1]=1是因爲默認可以進入obstacleGrid[0][0]點,即對應dp[1][1]
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m=obstacleGrid.size();
int n=obstacleGrid[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
dp[0][1]=1;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(obstacleGrid[i-1][j-1]==0)
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[m][n];
}
};