题目分析:
- 用一个数组表示股票每天的价格,数组中第i个数表示股票在第i天的价格。 可以进行多次交易,但在存在两个限制条件:1)不可以同时进行多次交易(必须卖出股票前再买一次股票);2)售出股票后,不能在第二天在买股票(冷冻期);求此时的最大收益。
解题思路:
动态规划求解
此题原前面题目的最大区别在于,股票交易过程中存在冷冻期,即如果某天买了股票,那么第二天不能买股票。解题过程中需要维护三个数组:buy,sell,rest。其中:
- buy[i]表示在第i天之前最后一个操作是买,此时的最大收益。
- sell[i]表示在第i天之前最后一个操作是卖,此时的最大收益。
- rest[i]表示在第i填之前最后一个操作是冷冻期,此时的最大收益。
对应递推公式为:
- buy[i] = max(rest[i 1] price, buy[i 1])
- sell[i] = max(buy[i 1] + price, sell[i 1])
- rest[i] = max(sell[i 1], buy[i 1], rest[i 1])
由于不可能出现buy rest buy情况,故三个递推式可以精简到两个,即为:
- buy[i] = max(rest[i 2] price, buy[i 1])
- sell[i] = max(buy[i 1] + price, sell[i 1])
实现程序
class Solution { public: int maxProfit(vector<int> &prices) { int buy = INT_MIN; int pre_buy = 0; int sell = 0; int pre_sell = 0; for (int i = 0; i < prices.size(); i++) { pre_buy = buy; // 买的情况 buy = max(pre_sell - prices[i], pre_buy); pre_sell = sell; // 卖的情况 sell = max(pre_buy + prices[i], pre_sell); } return sell; } };