class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>> dp(len, vector<int>(4, 0));
dp[0][0] = -prices[0];
for(int i = 1; i < len; i++){
// 状态一持有:原状 + 二买入 +四买入
dp[i][0] = max(dp[i-1][0], max(dp[i-1][1]-prices[i],dp[i-1][3]-prices[i]));
// 状态二保卖:原状 + 四
dp[i][1] = max(dp[i-1][1], dp[i-1][3]);
// 状态三今卖:一卖出
dp[i][2] = dp[i-1][0] + prices[i];
// 状态四冷冻:今卖
dp[i][3] = dp[i-1][2];
}
return max(dp[len-1][1], max(dp[len-1][2], dp[len-1][3]));
}
};
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int len = prices.size();
vector<vector<int>> dp(len, vector<int>(2, 0));
dp[0][0] = -prices[0];
for(int i = 1; i < len; i++){
// 持有:原状 + 买入
dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]);
// 不持有:原状 + 卖出持有(包含手续费)
dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i] - fee);
}
return dp[len - 1][1];
}
};