63. 不同路径 II
题目地址 :63. 不同路径 II - 力扣(LeetCode)
题解思路:dp
时间复杂度:O(n * m)
空间复杂度:O(n * m)
代码:
cpp
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
// dp[][]: 走到该位置的数量
// 转移:dp[i][j] = dp[i - 1][j] + dp[i][j - 1], 0
// 初始化:第一行 = dp[i - 1][0], 0;同理第一列
// 顺序:左右,上下
vector<vector<int>>dp(obstacleGrid.size(), vector<int>(obstacleGrid[0].size(), 0));
int n = obstacleGrid.size(), m = obstacleGrid[0].size();
for(int i = 0; i < n && obstacleGrid[i][0] == 0; i++){ // 如果有障碍物就终止循环
dp[i][0] = 1;
}
for(int j = 0; j < m && obstacleGrid[0][j] == 0; j++){
dp[0][j] = 1;
}
for(int i = 1; i < n; i++){
for(int j = 1; j < m; j++){
dp[i][j] = obstacleGrid[i][j] == 1 ? 0 : dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[n - 1][m - 1];
}
};
343. 整数拆分
题目地址 :343. 整数拆分 - 力扣(LeetCode)
题解思路:dp
时间复杂度:O(n^2)
空间复杂度:O(n)
代码:
cpp
class Solution {
public:
int integerBreak(int n) {
// dp[]: 拆i的最大乘积,如dp[10] = 36
// 递推:i可以拆为j + (i - j);dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))
// 初始化:dp[2] = 1
// 顺序:左到右
vector<int>dp(n + 1);
dp[2] = 1;
for(int i = 3; i <= n; i++){
for(int j = 1; j <= i/2; j++){ // 遍历到i / 2即可
dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
}
}
return dp[n];
}
};