1. 买卖股票的最佳时机含冷冻期
题目链接🔗
- 🍎题目思路:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n + 1, vector(3, 0));
dp[0][0] = 0, dp[0][1] = -prices[0], dp[0][2] = 0;
for (int i = 1; i < n; i ++)
{
dp[i][0] = dp[i - 1][1] + prices[i];
dp[i][1] = max(dp[i - 1][2] - prices[i], dp[i - 1][1]);
dp[i][2] = max(dp[i - 1][0], dp[i - 1][2]);
}
return max(dp[n - 1][0], dp[n - 1][2]);
}
};
2. 买卖股票的最佳时机Ⅳ ---- 只允许交易 k 次🖊
题目链接🔗
- 🍎题目思路:
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
int n = prices.size();
vector<vector<int>> f(n + 1, vector(k + 1, 0));
vector<vector<int>> g(n + 1, vector(k + 1, 0));
for (int j = 0; j <= k; j ++)
{
f[0][j] = -0x3f3f3f3f;
g[0][j] = -0x3f3f3f3f;
}
f[0][0] = -prices[0];
g[0][0] = 0;
for (int i = 1; i < n; i ++)
{
for (int j = 0; j <= k; j ++)
{
f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);
g[i][j] = g[i - 1][j];
if (j - 1 >= 0)
g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);
}
}
int ans = g[n - 1][0];
for (int i = 0; i <= k; i ++)
ans = max(ans, g[n - 1][i]);
return ans;
}
};