LC.63. 不同路径 II

传送门

思路:显然是动态规划,不能走的位置 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[i1][j]+dp[i][j1]

时间复杂度: 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[j1]

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];
    }
};