62. 不同路径

Leetcode62. 不同路径_算法

dp[i][j]表示经过下标i,j的路径

dp[0][0...n]=1

dp[0...n][0]=1

dp[i][j]=dp[i-1][j]+dp[i][j-1]

class Solution {
public:
    int uniquePaths(int m, int n) {
vector<vector<int>>dp(m+1,vector<int>(n+1));
for(int i=0;i<n;i++)
{
dp[0][i]=1;
}
for(int i=0;i<m;i++)
{
    dp[i][0]=1;
}
//dp[i][j]=dp[i][j-1]+dp[i-1][j]
for(int i=1;i<m;i++)
{
    for(int j=1;j<n;j++)
    {
        dp[i][j]=dp[i][j-1]+dp[i-1][j];
    }
}

return dp[m-1][n-1];
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

Leetcode62. 不同路径_算法_02

 dp[i][j]表示经过i,j的路径数

出口:

dp[0][j]如果遇到1,1之后(包括1)之后的所有dp数组为0(在第一行某个地方遇到障碍物)

dp[i][0]如果遇到1,1之后(包括1)之后的所有dp数组为0(在第一列某个地方遇到障碍物)

状态转移方程:

dp[i][j]=0,如果i,j处有障碍物

dp[i][j]=dp[i-1][j]+dp[i][j-1]

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
vector<vector<int>>dp(obstacleGrid.size(),vector<int>(obstacleGrid[0].size(),0));
int m=obstacleGrid.size();
int n=obstacleGrid[0].size();
//有1之后的dp[0][]和dp[][0]均为0(包括1)
for(int i=0;i<m;i++)
{
    if(obstacleGrid[i][0]==0)
    dp[i][0]=1;
    else
    {
        dp[i][0]=0;
        break;
    }
}
for(int i=0;i<n;i++)
{
    if(obstacleGrid[0][i]==0)
    {
        dp[0][i]=1;
    }
    else
    {
        dp[0][i]=0;
        break;
    }
}
for(int i=1;i<m;i++)
{
    for(int j=1;j<n;j++)
    {
        if(obstacleGrid[i][j]==1)
        {
            dp[i][j]==0;
        }
        else 
        {
            dp[i][j]=dp[i-1][j]+dp[i][j-1];
        }
        
    }
}
return dp[m-1][n-1];
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.