C# · 12月 20, 2021

【LeetCode】309. 最佳买卖股票时机含冷冻期 结题报告 (C++)

原题地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/

题目描述:

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

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

你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例:

输入: [1,2,3,2]

输出: 3 

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

解题方案:

使用动态规划的方法解题,参考地址:https://blog.csdn.net/qq_17550379/article/details/82856452

这是股票系列问题中目前来看最难的一个,不过有了前面几个问题的思路,这个问题求解起来非常容易。首先,我们看到问题中提到了三种状态buy、sell和cooldown,那么我们脑中的第一个想法就是通过动态规划来解

如果我们index:i天为冷冻期,那么只能说明index:i-1天卖掉了股票,那么i天的收益和i-1天是一样的

cooldown[i]=sell[i-1]

如果我们考虑index:i天卖出,要求利润最大的话。那么无非是index:i-1之前就持有股票,所以index:i-1天也可以卖出,或者另一种情况就是index:i-1当天买入了股票。

sell[i]=max(sell[i-1],buy[i-1]+prices[i])

如果我们考虑index:i天买入,要求利润最大的话。无非是index:i-1之前就不持有股票,我们要考虑哪天买,所以index:i-1也可以买入,或者另一种可能就是index:i-1天是冷冻期。

buy[i]=max(buy[i-1],cooldown[i-1]-prices[i])

我们第一天不可能卖出或者冻结,那么这两个sell[0]=0 cooldown[0]=0,但是我们第一天可以买入啊,所以buy[0]=-prices[0]。还有一点要注意的就是,我们一定是最后一天卖出或者最后一天冻结利润最大。

代码:

class Solution {

public:

int maxProfit(vector& prices) {

if (!prices.size())

return 0;

vector buy(prices.size(),0),sell(prices.size(),cooldown(prices.size(),0);

buy[0] = -prices[0];

for (unsigned int i = 1; i < prices.size(); ++i)

{

cooldown[i] = sell[i – 1];

sell[i] = max(sell[i – 1],buy[i – 1] + prices[i]);

buy[i] = max(buy[i – 1],cooldown[i – 1] – prices[i]);

}

return max(sell[prices.size() – 1],cooldown[prices.size() – 1]);

}

};