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


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

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

    交易次数不限。求可以获得的最大利润。

    根据题意,画出DFA如下

    每天可以采取的动作有3种:

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

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

    如果当天或之前有买入动作,则状态为hold,持有股票。

    如果当天有卖出动作,则状态变为sold。手头不再持有股票,但也不能买入。

    至此,我们可以分别计算3种状态下,采取不同的行动以后各个状态的最大利润。

    hold:

    前一天为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);
        }
    };
  • 相关阅读:
    PS 修复画笔
    PS 魔棒工具、仿制图章
    PS选区的应用
    PS界面介绍
    火狐浏览器任务栏设置默认 隐私模式开启
    [CSS] Using inline-grid to gain easy control over gap and size
    [AWS] Presign url for S3
    [CSS] Customer focus / disabled style for select element
    [CSS] Using single grid-template-area and justify-self to select arrow down icon in select
    [CSS 3] Using CSS attribute selector
  • 原文地址:https://www.cnblogs.com/k330/p/6502891.html
Copyright © 2020-2023  润新知