62.不同路径
题目链接:62.不同路径
文档讲解:代码随想录
思路
- 确定dp数组以及下标的含义:dp[i][j]表示从(0, 0)出发,到达(i, j)有dp[i][j]条路径
- 确定递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1],从上方或者左侧到达
- dp数组如何初始化:dp[0][j] = 0, dp[i][0] = 0
- 确定遍历顺序:从左到右一层一层遍历
代码
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 1));
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};
63. 不同路径 II
题目链接:63. 不同路径 II
文档讲解:代码随想录
思路
- 确定dp数组以及下标的含义:dp[i][j]表示从(0, 0)出发,到达(i, j)有dp[i][j]条路径
- 确定递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1],从上方或者左侧到达
- dp数组如何初始化:第一行和第一列障碍物前初始化为1,障碍物之后初始化为0
- 确定遍历顺序:从左到右一层一层遍历
代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
if (obstacleGrid[0][0] == 1)
return 0;
int rows = obstacleGrid.size();
int cols = obstacleGrid[0].size();
vector<vector<int>> dp(rows, vector<int>(cols, 0));
// 初始化
dp[0][0] = 1;
for (int i = 1; i < rows; i++) {
if (obstacleGrid[i][0] == 1)
dp[i][0] = 0;
else
dp[i][0] = dp[i - 1][0];
}
for (int i = 1; i < cols; i++) {
if (obstacleGrid[0][i] == 1)
dp[0][i] = 0;
else
dp[0][i] = dp[0][i - 1];
}
for (int i = 1; i < rows; i++) {
for (int j = 1; j < cols; j++) {
if (obstacleGrid[i][j] == 1)
dp[i][j] = 0;
else
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[rows - 1][cols - 1];
}
};