不同路径 2
- [1. 题目解析](#1. 题目解析)
- [2. 讲解算法原理](#2. 讲解算法原理)
- [3. 编写代码](#3. 编写代码)
1. 题目解析
题目地址 :点这里
2. 讲解算法原理
-
首先,通过obstacleGrid的大小确定网格的行数m和列数n。
-
创建一个大小为(m+1) × (n+1)的二维动态规划数组dp,其中dp[i][j]表示从起点到达网格位置(i-1, j-1)的路径数量。
-
初始化动态规划数组的第一行和第一列:
- 将dp[0][1]初始化为1,表示从起点位置开始的路径数量为1。
- 对于第一行和第一列的其他位置,由于只能向右或向下移动,如果遇到障碍物(obstacleGrid[i-1][j-1]为1),则路径数量为0;否则,路径数量与前一个位置的路径数量相同。
- 从网格的第二行第二列开始,依次填表。对于每个位置(i, j),计算dp[i][j]的值:
- 如果当前网格位置不是障碍物(obstacleGrid[i-1][j-1]不等于1),说明可以从上方格子到达当前位置,路径数量为dp[i-1][j];
- 如果当前网格位置不是障碍物(obstacleGrid[i-1][j-1]不等于1),说明可以从左方格子到达当前位置,路径数量为dp[i][j-1]。
- 将上述两种路径数量相加,得到从起点到达当前位置的路径数量,并将其赋给dp[i][j]。
- 最后,返回动态规划数组中右下角位置(m, n)的值,即从起点到达终点的路径数量。
3. 编写代码
cpp
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int n=obstacleGrid[0].size();
int m=obstacleGrid.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++)
{
if(obstacleGrid[i-1][j-1]!=1)
dp[i][j]=dp[i][j-1]+dp[i-1][j];
}
}
return dp[m][n];
}
};