个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
点击直接跳转到该题目
1️⃣题目描述
一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0
来表示。
示例1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有 2 条不同的路径:
- 向右 -> 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右 -> 向右
示例2:
输入:obstacleGrid = [[0,1],[0,0]]
输出:1
2️⃣题目解析
1.状态表示:dp[i][j]表示到达i,j位置时一共有多少种方法。
2.状态转移方程:分为两种情况:
情况一:有障碍物,当前位置dp值为0。
情况二:无障碍物,当前位置dp[i][j] = dp[i-1][j] + dp[i][j-1]
3.初始化:初始化时注意下标的映射关系,同时为了填表正确,在初始化时必须该dp[1][0]或者dp[0][1]
初始化为1
。
4.填表顺序,从上往下填写每一行,每一行从左往右。
5.返回值:返回dp[m][n]。
文章来源:https://www.toymoban.com/news/detail-597807.html
这里需要注意的时,创建dp表的时候,dp表的规模要在比之前多一行多一列。文章来源地址https://www.toymoban.com/news/detail-597807.html
3️⃣解题代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& ob) {
//创建dp表
//初始化
//填表
//返回值
int m = ob.size(), n = ob[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(ob[i-1][j-1] == 0)
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m][n];
}
};
到了这里,关于【算法|动态规划No.6】leetcode63. 不同路径Ⅱ的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!