LeetCode 309. Best Time to Buy and Sell Stock with Cooldown

题目意思大概是给出连续n天的股价,做出以下限制:spa

  1. 只能一次性买入卖出,不能分批交易。分屡次买入再卖出或者买入一次而后分屡次卖出都是不容许的。
  2. 卖出之后有一天的时间不能交易 (one day cooldown time)。

交易次数不限。求能够得到的最大利润。code

 

根据题意,画出DFA以下blog

天天能够采起的动做有3种:it

  1. 什么也不干
  2. 买入
  3. 卖出

初始状态为idle,手头没有任何股票,且能够进行买入交易。io

若是当天或以前有买入动做,则状态为hold,持有股票。class

若是当天有卖出动做,则状态变为sold。手头再也不持有股票,但也不能买入。im

至此,咱们能够分别计算3种状态下,采起不一样的行动之后各个状态的最大利润。img

hold:di

前一天为idle,当天买入,或者以前有买入动做,当天什么也不作:时间

hold = max(idle - prices[i], hold);

idle:

idle能够由以前的idle或sold状态变化而来:

idle = max(idle, sold);

sold:

当天卖出,由hold状态变化而来,注意,当天买入当天卖出是容许的。

sold = hold + prices[i];

 

最终代码以下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.empty() || prices.size() <= 1){
            return 0;
        }
        
        int idle = 0, hold = -prices[0], sold = 0;
        for(int i = 1; i < prices.size(); i++){
            hold = max(idle - prices[i], hold);
            idle = max(idle, sold);
            sold = hold + prices[i];
        }
        
        return max(sold, idle);
    }
};
相关文章
相关标签/搜索