309. 最佳买卖股票时机含冷冻期

题目

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

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

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

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

思路

这道题看到了一个很有意思的解法。
首先每一天的能进行的操作无非就是买,卖,什么也不干这3种。

那么我们每一天可能有三种状态
buy(可以卖,也可以什么也不做,但不能买)
sell (只能什么也不做)
nothing(可以买,也可以什么也不做,但不能卖东西)

用三个变量分别记录下每一天这三种状态的最大金钱数。(preBuy,preSell,preNothing是上一天这三种状态的金钱数)

buy = max(preBuy , preNothing - prices[loop] );
sell = preBuy + prices[loop] ;
nothing = max(preNothing , preSell );

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() == 0){
            return 0;
        }
        int buy = -prices[0] , sell = 0 , nothing = 0;
        for(int loop = 1 ; loop < prices.size() ; loop++){
            int preBuy = buy;
            int preSell = sell;
            int preNothing = nothing;
            buy = max(preBuy ,  preNothing - prices[loop]  );
            sell =  preBuy + prices[loop] ;
            nothing = max(preNothing , preSell  );
            //cout << buy << " " << sell << " " << nothing <<endl;
        }
        return max(nothing , sell);
    }
};

猜你喜欢

转载自blog.csdn.net/DDghsot/article/details/84880637