今天是动态规划的第2部分,开冲!!!
今日任务:
- 62.不同路径
- 63.不同路径II
今天开始逐渐有 dp的感觉了,题目不多,就两个 不同路径,可以好好研究一下
题目一:62.不同路径
Leetcode题目:【62.不同路径】
参考:【代码随想录之不同路径】
按照动态规划五部曲来看:
(1)dp数组及其下标的含义:dp[i][j]表示从[0,0]走到[i,j]有多少种不同的路径;
(2)递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1];
(3)初始化dp数组:最上方都为1,最左边都为1;
(4)遍历的顺序:从左到右,从上到下(因为初始值就是在左边和上边);
(5)打印dp数组(仅当结果出错的时候)
注意点:生成固定长度的二维数组应该怎么写,见下面的代码:
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m,vector<int>(n));
for(int i = 0; i < m; i++) dp[i][0] = 1;
for(int i = 0; i < n; i++) dp[0][i] = 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
Leetcode题目:【63.不同路径II】
参考:【代码随想录之不同路径II】
此题与上一个题目的区别在于多了一个障碍物,然后在递推方程和初始化的时候进行了变动:
按照动态规划五部曲来看:
(1)dp数组及其下标的含义:dp[i][j]表示从[0,0]走到[i,j]有多少种不同的路径;
(2)递推公式:在不是障碍物的时候,进行下面操作:dp[i][j] = dp[i-1][j] + dp[i][j-1];
(3)初始化dp数组:没遇到障碍物则最上方都为1,其余为0;没遇到障碍物最左边都为1,其余为0;
(4)遍历的顺序:从左到右,从上到下(因为初始值就是在左边和上边);
(5)打印dp数组(仅当结果出错的时候)
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));
for(int i = 0; i<m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
for(int i = 0; i<n && obstacleGrid[0][i] == 0; i++) dp[0][i] = 1;
for(int i = 1; i<m; i++){
for(int j = 1; j<n; j++){
if(obstacleGrid[i][j] == 0){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[m -1][n -1];
}
};