【题目】
给定一个整数数组,其中第i个元素代表了第i天的股票价格。
设计一个算法计算出最大利润。在满足以下约束条件下,可以尽可能完成更多的交易(多次买卖一支股票):
- 不能同时参与多笔交易(必须在再次购买之前出售之前的股票)
- 卖出股票后,无法在第二天买入股票(即冷冻期为1天)
示例:
- 输入:[1,2,3,0,2]
- 输出:3
- 解释:对应的交易状态为:[买入,卖出,冷冻,买入,卖出]
【思路】
动态规划
对问题进行建模:每天资金可能所属的状态分为三类
- cool:当日卖出股票,进入冷冻期(注意:实际上是第二天为冷冻期,但在卖出当天记录为cool状态)
- hold:当日持有股票
- free:当日不持股票且资金自由
分析三者关系
- 若当前状态为cool: 则下一天解除冻结,状态必定为free
- 若当前状态为hold: 则下一天可以继续持有股票(hold),也可以卖出股票进入cool
- 若当前状态为free: 则下一天可以继续选择不买入保持free,也可以买入进入hold
则反向推理关系:
- 若当前状态为cool: 则前一天必定卖出股票 cool[i]=hold[i-1]+p[i]
- 若当前状态为hold: 则前一天可能为hold,也可能为free买入股票 hold[i]=max(hold[i-1], free[i-1]-p)
- 若当前状态为free: 则前一天可能为free,也可能为cool free[i]=max(free[i-1], cool[i-1])
【C++代码】
class Solution
{
public:
int maxProfit(vector<int>& prices)
{
if(prices.size()<=1)
return 0;
int cool=0, free=0, hold=INT_MIN, pre_cool;//INT_MIN表示初始时不可能为hold状态
for(auto p:prices)
{
pre_cool = cool;
cool = hold + p;
hold = max(hold, free-p);
free = max(free, pre_cool);
}
return max(free, cool);//最后一天的状态不可能为hold
}
};
来源:CSDN
作者:wwrict
链接:https://blog.csdn.net/wwrzzu/article/details/103705015