62. 不同路径
补充: 对二维数组的操作
- dp[j][i] 表示到 j,i 有多少种路径
- 递推公式: dp[j][i] = dp[j - 1][i] + dp[j][i - 1]
- 初始化: dp[0][i] 和 dp[j][0] 都只有1种情况
- 遍历顺序: 由于dp[j][i] 由 上和左的元素推导, 所以采用从左到右、从上到下的遍历顺序
class Solution {
public:
void uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 0));
//初始化
for (int i = 0; i < dp[0].size(); i++) dp[0][i] = 1;
for (int i = 0; i < dp.size(); i++) dp[i][0] = 1;
//递推公式
for (int j = 1; j < m; j++) {
for (int i = 1; i < n; i++) {
dp[j][i] = dp[j][i - 1] + dp[j - 1][i];
}
}
//输出dp[j][i]
for (int j = 0; j < dp.size(); j++) {
for (int i = 0; i < dp[i].size(); i++) {
cout << dp[j][i] << " ";
}
cout << endl;
}
return dp[m - 1][n - 1];
}
};
63. 不同路径 II
参考
- dp[j][i] 表示到(j, i) 后的路径数
- 递推公式
- 初始化 dp[0][i] 和 dp[j][0] 为 1 ,当遇到障碍物后变 0
- 遍历顺序同上
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int n = obstacleGrid[0].size();
int m = obstacleGrid.size();
vector<vector<int>> dp = vector<vector<int>>(m, vector<int>(n, 0));
for (int i = 0; i < n; i++) {
if (obstacleGrid[0][i] == 1) break;
dp[0][i] = 1;
}
for (int j = 0; j < m; j++) {
if (obstacleGrid[j][0] == 1) break;
dp[j][0] = 1;
}
for (int j = 1; j < m; j++) {
for (int i = 1; i < n; i++) {
if (obstacleGrid[j][i] == 1) {//该点有障碍
dp[j][i] = 0;
} else {
dp[j][i] = dp[j][i - 1] + dp[j - 1][i];
}
}
}
return dp[m - 1][n - 1];
}
};
343. 整数拆分
- dp[i] : 整数i的最大乘积
- 递推公式
- 初始化
- 遍历顺序
未弄懂
96. 不同的二叉搜索树