今日任务
188.买卖股票的最佳时机IV
- 题目链接: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/
- 题目描述:
Code
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
// 状态机DP, 记忆化搜索
int n = prices.size();
// vector<vector<array<int, 2>>> memo(n, vector<array<int, 2>>(k + 1, {-1, -1}));
// function<int(int, int, bool)> dfs = [&](int i, int j, bool hold)->int{
// if(j < 0){
// return INT_MIN;
// }
// if(i < 0){
// return hold ? INT_MIN : 0;
// }
// int &res = memo[i][j][hold];
// if(res != -1){
// return res;
// }
// if(hold){
// return res = max(dfs(i - 1, j, true), dfs(i - 1, j, false) - prices[i]);
// }
// return res = max(dfs(i - 1, j, false), dfs(i - 1, j - 1, true) + prices[i]);
// };
// return dfs(n - 1, k, false);
// 递推
vector<array<int, 2>> dp(k + 2, {INT_MIN / 2, INT_MIN / 2});
for(int j = 1; j <= k + 1; j++){
dp[j][0] = 0;
}
for(int x : prices){
for(int j = k + 1; j > 0; j--){
dp[j][0] = max(dp[j][0], dp[j - 1][1] + x);
dp[j][1] = max(dp[j][1], dp[j][0] - x);
}
}
return dp[k + 1][0];
}
};
309.最佳买卖股票时机含冷冻期
- 题目链接: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/
- 题目描述:
Code
class Solution {
public:
int maxProfit(vector<int>& prices) {
// 状态机DP
int n = prices.size();
// vector<array<int, 2>> memo(n, {-1, -1});
// function<int(int, bool)> dfs = [&](int i, bool hold)->int{
// if(i < 0){
// return hold ? INT_MIN : 0;
// }
// int & res = memo[i][hold];
// if(res != -1){
// return res;
// }
// if(hold){
// return res = max(dfs(i - 1, true), dfs(i - 2, false) - prices[i]);
// }
// return res = max(dfs(i - 1, false), dfs(i - 1, true) + prices[i]);
// };
// return dfs(n - 1, false);
int f0 = 0, f1 = 0, f2 = INT_MIN;
for(int x : prices){
int newf = max(f1, f2 + x);
f2 = max(f2, f0 - x);
f0 = f1;
f1 = newf;
}
return f1;
}
};
714.买卖股票的最佳时机含手续费
- 题目链接: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
- 题目描述:
Code
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int f0 = 0, f1 = INT_MIN / 2;
for(int x : prices){
int newf0 = max(f0, f1 + x); // 卖出
f1 = max(f1, f0 - x - fee); // 买入
f0 = newf0;
}
return f0;
}
};