62. 不同路径
1.代码
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>>f(m,vector<int>(n, 0));
for (int i = 0; i < m; i++) f[i][0] = 1;
for (int i = 0; i < n; i++) f[0][i] = 1;
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
return f[m - 1][n - 1];
}
};
2.递归五部曲
1.确定dp数组和下标的含义
f[i][j]相当于到达低i层第j列的路径数
2.确定递推公式
一般都是看最后几个或中间,明白f[i][j]等于从左边路径数和从上面路径数之和,所以f[i][j]=f[i-1][j]+f[i][j-1];
3.dp数组如何初始化
根据递推公式必须要左和上面的东西,当最左边和最上面没有两边所以需要初始化,
4.确定循环的顺序
从右向左与一层一层的写
5.举例推导dp数组
用前面几个推到就行了,
63. 不同路径 II
1.代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int lie = obstacleGrid.size();
int col = obstacleGrid[0].size();
vector<vector<int>>f(lie, vector<int>(col, 0));
for (int i = 0; i < lie; i++) {
if (obstacleGrid[i][0] == 1) break;
if (obstacleGrid[i][0] == 0) f[i][0] = 1;
}
for (int i = 0; i < col; i++) {
if (obstacleGrid[0][i] == 1) break;
if (obstacleGrid[0][i] == 0) f[0][i] = 1;
}
for (int i = 1; i < lie; i++) {
for (int j = 1; j < col; j++) {
if (obstacleGrid[i][j] != 1) f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
return f[lie - 1][col - 1];
}
};
2.动规五部曲
第一步相同
第二步相同
第三步:初始化
当遇到石头时,就不需要赋值1了,因为后面也遍历不到了,所以不需要遍历,因为只能两个方向到这个点
第四步相同
第五步
因为如果这个点是石头就为0不判断,这也是推到出来的
二刷解析:
先写一个递推公式,如果不行加if,再不行才再增加递推公式