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

本文详细解释了如何使用动态规划算法解决LeetCode中的两个问题:一个是计算m*n网格中从左上角到右下角的不同路径数量,另一个是在存在障碍物的网格中寻找可通行路径。通过状态转移方程和初始化步骤来求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态规划算法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];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值