[LeetCode]63. Unique Paths II

本文介绍了解决LeetCode上63题不同路径 II 的动态规划方法。这是对62题的不同路径问题的扩展,增加了路障元素。文章详细解释了如何根据障碍物调整动态规划的状态转移方程,并提供了完整的C++实现代码。

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

[LeetCode]63. Unique Paths II

题目描述

这里写图片描述
[LeetCode]62. Unique Paths的扩展
增加了路障

思路

动态规划
过程中需要考虑该点是否可以通过,对于不可通过的点,在dp数组中直接置为0;
在初始状态时也要考虑,若终点不可到达,直接置为0,若在与终点处于同一直线的点不可到达,需要将这一点前的所有点置为0
例如
当前状态为

ob012
0000
1010

则对应的dp数组为

dp012
0111
1001

代码

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int row = obstacleGrid.size(),
            col = obstacleGrid[0].size();
        vector<vector<int>> dp(row, vector<int>(col));
        for(int i = row - 1; i >= 0; --i)
            for (int j = col - 1; j >= 0; --j) {
                if (i == row - 1 && j == col - 1)
                    dp[i][j] = obstacleGrid[i][j] == 0 ? 1 : 0;
                else if (i == row - 1)
                    dp[i][j] = dp[i][j + 1] && (!obstacleGrid[i][j]);
                else if (j == col - 1)
                    dp[i][j] = dp[i + 1][j] && (!obstacleGrid[i][j]);
                else
                    dp[i][j] = obstacleGrid[i][j] == 0 ? dp[i][j + 1] + dp[i + 1][j] : 0;
            }

        return dp[0][0];
    }
};

int main() {
    vector<vector<int>> obs = { {0,0,0},{0,1,0},{0,0,0} };
    Solution s;
    cout << s.uniquePathsWithObstacles(obs) << endl;

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值