309.最佳买卖股票时机含冷冻期
我用的三个状态:
- 状态一:当天无操作,即当天为冷冻期或者前面卖出了股票,保持状态
- 状态二:当天买入
- 状态三:当天卖出
卡哥用的四个状态,更加清晰明了,将我的状态一分成了两个【309.最佳买卖股票时机含冷冻期】
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.size() == 1) return 0;
vector<vector<int>> dp(prices.size(), vector<int>(3));
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[0][2] = 0;
for (int i = 1; i < prices.size(); i++) {
dp[i][0] = max(dp[i - 1][2], dp[i - 1][0]);
dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);
dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2]);
}
return dp[prices.size() - 1][2];
}
};
714.买卖股票的最佳时机含手续费
此题做法和122.买卖股票的最佳时机II的做法一样,只不过加了一个手续费,将这个费用减去就可以了,注意只能减一次
我开始是卖出时减去费用,但是初始化的时候容易导致后面有的样例不通过,改为了买入时减去费用
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
vector<vector<int>> dp(prices.size(), vector<int>(2));
dp[0][0] = -prices[0] - fee;
dp[0][1] = 0;
for (int i = 1; i < prices.size(); i++) {
dp[i][0] = max(dp[i - 1][1] - prices[i] - fee, dp[i - 1][0]);
dp[i][1] = max(dp[i - 1][0] + prices[i], dp[i - 1][1]);
}
return dp[prices.size() - 1][1];
}
};