- 188. 买卖股票的最佳时机 IV
和123. 买卖股票的最佳时机 III类似,不过是扩展到了k次交易,可以用
2*k+1个空间来记录各种状态
AC代码:
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
int n = prices.size();
// dp[i][0]代表不操作
// dp[i][2*j-1]代表持有股票的最大利润
// dp[i][2*j]代表不持有股票的最大利润
vector<vector<int>> dp(n, vector<int>(2 * k + 1));
for (int j = 1; j <= k; j++) {
dp[0][2 * j - 1] = -prices[0];
}
for (int i = 1; i < n; ++i) {
for (int j = 1; j <= k; ++j) {
dp[i][2 * j - 1] =
max(dp[i - 1][2 * j - 1], dp[i - 1][2 * j - 2] - prices[i]);
dp[i][2 * j] =
max(dp[i - 1][2 * j], dp[i - 1][2 * j - 1] + prices[i]);
}
}
return dp[n - 1][2 * k];
}
};
多记录一个冷冻期的状态,买入是由冷冻期转移而来,冷冻期则是由上一次的冷冻期或是卖出状态转移而来
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
// dp[i][0] 买入
// dp[i][1] 卖出
// dp[i][2] 冷冻期
vector<vector<int>> dp(n, vector<int>(3));
dp[0][0] = -prices[0];
for (int i = 1; i < n; ++i) {
dp[i][0] = max(dp[i - 1][0], dp[i - 1][2] - prices[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
dp[i][2] = max(dp[i - 1][2], dp[i - 1][1]);
}
return max(dp[n - 1][1], dp[n - 1][2]);
}
};
和122. 买卖股票的最佳时机 II类似,不过多了一个手续费,在卖出时减去就好
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size();
vector<int> dp(2);
dp[0] = -prices[0];
for (int i = 1; i < n; ++i) {
dp[0] = max(dp[0], dp[1] - prices[i]);
dp[1] = max(dp[1], dp[0] + prices[i] - fee);
}
return dp[1];
}
};
- [ ]