目录
题目链接:62.不同路径
思路
①dp[i][j]表示从(0,0)到(i,j)有dp[i][j]条路径
②递推公式:dp[i][j] = dp[i][j-1] + dp[i-1][j],只可能从两个路径过来,左或者上
③dp数组初始化,dp[0][0] = 0,dp[i][0] = 1,dp[0][j] = 1
④遍历顺序,从左到右一层一层遍历
⑤推到dp数组
代码
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 0)); // 定义dp数组
// dp数组初始化
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (int j = 0; j < n; j++) {
dp[0][j] = 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
思路
①dp[i][j]表示从(0,0)到(i,j)有dp[i][j]条路径
②递推公式:dp[i][j] = dp[i][j-1] + dp[i-1][j],只可能从两个路径过来,左或者上
③dp数组初始化,dp[0][0] = 0,dp[i][0] = 1,dp[0][j] = 1
④遍历顺序,从左到右一层一层遍历
⑤推到dp数组
处理障碍物:如果遇到障碍物dp数组对应位置保持初始状态0。
代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
// 获取行列数
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<int>> dp(m, vector<int>(n, 0)); // 定义dp数组
// dp数组初始化
for (int i = 0; i < m; i++) {
if (obstacleGrid[i][0] == 1)
break; // 障碍物之后无法到达,默认为0
dp[i][0] = 1;
}
for (int j = 0; j < n; j++) {
if (obstacleGrid[0][j] == 1)
break; // 障碍物之后无法到达,默认为0
dp[0][j] = 1;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 1)
continue; // 遇到障碍物时,跳过当前位置的处理
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};
总结
①路径问题,与台阶问题相似,每次前进都有两种方向,由此推出递推公式
②加入障碍物后,在原有代码上添加对障碍物的考虑即可,遇到障碍物跳过
③动态规划五部曲很好用