1.题目解析
题目来源:63.不同路径||——力扣
测试用例
2.算法原理
本题与之前的62.不同路径相似,但是多了一种情况那就是遇见障碍物,因为遇见障碍物就需要避开,也就是说障碍物所在的位置的路径数为0
1.状态表示
创建一个dp表,多开一行一列用来存储初始值,其中dp[i][j]所在的位置代表从起点到该位置的所有路径数
2.状态转移方程
因为每次移动只能右移或者下移,所以某位置路径数就是其上方位置与左边位置路径数之和:dp[i][j] = dp[i-1][j] + dp[i][j-1],这里只是多考虑了障碍物的情况为0,但是不妨碍相加
3.初始化
只需要初始化虚拟位置的dp[0][1]=1即可,这里也可以是dp[1][0],只需要保证dp[1][1]的位置是1就可以
4.填表顺序
从上至下,每一行从左到右
5.返回值
返回dp[m][n]即可
3.实战代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& ob)
{
int m = ob.size(),n = ob[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1));
dp[0][1] = 1;
for(int i = 1;i <= m;i++)
{
for(int j = 1;j <= n;j++)
{
//当没有遇到障碍物就直接相加上面的位置与左边的位置的所有情况
//反之遇到障碍物dp[i][j] = 0
if(ob[i-1][j-1] == 0)
{
dp[i][j] = dp[i][j-1] + dp[i-1][j];
}
}
}
return dp[m][n];
}
};