LeetCode刷题--- 不同路径 II
2024-01-07 19:04:06
个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客
个人专栏
力扣递归算法题
【C++】? ??
??????http://t.csdnimg.cn/6AbpV
数据结构与算法
前言:这个专栏主要讲述动态规划算法,所以下面题目主要也是这些算法做的 ?
我讲述题目会把讲解部分分为3个部分:
1、题目解析
2、算法原理思路讲解
3、代码实现
不同路径 II
题目链接:不同路径 II
题目
一个机器人位于一个?m x n
?网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用?1
?和?0
?来表示。
示例 1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2
条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右
示例 2:
输入:obstacleGrid = [[0,1],[0,0]] 输出:1
提示:
m ==?obstacleGrid.length
n ==?obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j]
?为?0
?或?1
解法
题目解析
- 一个机器人位于一个?
m x n
?网格的左上角 。 - 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。
- 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径。
- 网格中的障碍物和空位置分别用?
1
?和?0
?来表示。
算法原理讲解
我们这题使用动态规划,我们做这类题目可以分为以下五个步骤
- 状态显示
- 状态转移方程
- 初始化(防止填表时不越界)
- 填表顺序
- 返回值
- 状态显示
?dp[i][j] 表示:?到?[i, j]?位置处,?共有多少种方式。
- 状态转移方程
如果
dp[i][j]
表?到达
[i, j]
位置的?法数,那么到达
[i, j]
位置之前的??步,有两种情况:
- 从 [i, j] 位置的上?( [i - 1, j] 的位置)向下??步,转移到 [i, j] 位置。
- 从 [i, j] 位置的左?( [i, j - 1] 的位置)向右??步,转移到 [i, j] 位置。
但是, [i - 1, j] 与 [i, j - 1] 位置都是可能有障碍的,此时从上?或者左边是不可能到达 [i, j] 位置的,也就是说,此时的?法数应该是 0。
由此我们可以得出?个结论,只要这个位置上「有障碍物」,那么我们就不需要计算这个位置上的值,直接让它等于 0 即可。
- 初始化(防止填表时不越界)
只需将
dp[1][0]
的位置初始化为为1即可。
- 填表顺序
根据「状态转移」的推导,填表的顺序就是「从上往下」填每??,每??「从左往右」。
- 返回值
结果是返回?
dp[m][n]。
代码实现
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid)
{
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
dp[1][0] = 1;
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
if(obstacleGrid[i - 1][j - 1] == 0)
{
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[m][n];
}
};
文章来源:https://blog.csdn.net/weixin_74268082/article/details/135436032
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!