思路:显然是动态规划,不能走的位置 d p [ i ] [ j ] = 0 dp[i][j]=0 dp[i][j]=0即可。
否则状态转移一下: d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j]=dp[i-1][j]+dp[i][j-1] dp[i][j]=dp[i−1][j]+dp[i][j−1]。
时间复杂度: O ( n m ) O(nm) O(nm)
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& a) {
int ans=0;
int n=a.size(),m=a[0].size();
vector<vector<int> >dp(n+1,vector<int>(m+1,0));
if(a[0][0]||a[n-1][m-1]) return 0;
dp[1][1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(i==1&&j==1) continue;
if(a[i-1][j-1]) dp[i][j]=0;
else dp[i][j]=dp[i][j-1]+dp[i-1][j];
}
return dp[n][m];
}
};
因为是从上一个状态转移过来,考虑滚动数组优化空间。
d p [ j ] + = d p [ j ] + d p [ j − 1 ] dp[j]+=dp[j]+dp[j-1] dp[j]+=dp[j]+dp[j−1]。
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& a) {
int ans=0;
int n=a.size(),m=a[0].size();
vector<int>dp(m+1,0);
if(a[0][0]||a[n-1][m-1]) return 0;
dp[1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(i==1&&j==1) continue;
if(a[i-1][j-1]) dp[j]=0;
else dp[j]+=dp[j-1];
}
return dp[m];
}
};