LeetCode 62不同路径 63不同路径-II | 代码随想录25期训练营day39

动态规划算法2

LeetCode 62 不同路径 2023.12.2

int uniquePaths(int m, int n) {
    
    
    //1确定dp数组及其下标含义,这里为到达(i,j)位置的路径种数
    vector<vector<int>> dp(m, vector<int>(n));
    //3初始化,到达第一行、第一列的位置的种数都为1,因为只能向右或向下移动
    for (int i = 0; i < m; i++)
        dp[i][0] = 1;
    for (int j = 0; j < n; j++)
        dp[0][j] = 1;
    //2确定递推公式 4确定遍历顺序
    //递推公式中到达(i,j)位置只有两种办法,向下或者向右,那么到达该位置的种数=到达上面点的种数+到达左边点的种数
    //因为初始化已确定第一行和第一列种数,那么遍历从第二行、第二列开始
    for (int i = 1; i < m; i++)
    {
    
    
        for (int j = 1; j < n; j++)
            dp[i][j] = dp[i-1][j] + dp[i][j-1];
    }
    return dp[m-1][n-1];
}

LeetCode 63 不同路径-ii 2023.12.2

int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
    
    
    //row,col存储栅格的行数与列数
    int row = obstacleGrid.size();
    int col = obstacleGrid[0].size();
    //1确定dp数组及其下标含义:到达(i,j)位置的移动方法数
    vector<vector<int>> dp(row, vector<int>(col));
    //3递推初始化,第一行与第一列在没有障碍物的情况下到达种数都为1,
    //有障碍的情况下障碍物及后(下)面的位置到达种数为0,sym用于判断是否为障碍物后(下)的栅格
    int sym = 0;
    for (int i = 0; i < row; i++)
    {
    
    
        if(sym == 0 && obstacleGrid[i][0] == 0)
            dp[i][0] = 1;
        else
        {
    
    
            dp[i][0] = 0;
            sym = 1;
        }
    }
    sym = 0;
    for (int j = 0; j < col; j++)
    {
    
    
        if(sym == 0 && obstacleGrid[0][j] == 0)
            dp[0][j] = 1;
        else
        {
    
    
            dp[0][j] = 0;
            sym = 1;
        }
    }
    //2确定递推公式 4确定遍历顺序
    //当到达点(i,j)不是障碍物时,到达种数=dp[i-1][j]+dp[i][j-1];是障碍物时,dp[i][j]=0
    //因为第一行第一列已经初始化,所以从第二行第二列开始依次遍历
    for (int i = 1; i < row; i++)
    {
    
    
        for(int j = 1; j < col; j++)
        {
    
    
            if(obstacleGrid[i][j] == 0)
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            else
                dp[i][j] = 0;
        }
    }
    return dp[row-1][col-1];
}

猜你喜欢

转载自blog.csdn.net/weixin_66706867/article/details/134756483