LeetCode309-最佳买卖股票时机含冻结期

百般思念 提交于 2019-12-25 22:58:31

【题目】

给定一个整数数组,其中第i个元素代表了第i天的股票价格。

设计一个算法计算出最大利润。在满足以下约束条件下,可以尽可能完成更多的交易(多次买卖一支股票):

  • 不能同时参与多笔交易(必须在再次购买之前出售之前的股票)
  • 卖出股票后,无法在第二天买入股票(即冷冻期为1天)

示例:

  • 输入:[1,2,3,0,2]
  • 输出:3
  • 解释:对应的交易状态为:[买入,卖出,冷冻,买入,卖出]

【思路】

动态规划

对问题进行建模:每天资金可能所属的状态分为三类

  1. cool:当日卖出股票,进入冷冻期(注意:实际上是第二天为冷冻期,但在卖出当天记录为cool状态)
  2. hold:当日持有股票
  3. 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
    }
};

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!