leetcode_309 Best Time to Buy and Sell Stock with Cooldown

本文探讨了在股票买卖过程中存在冷冻期的复杂场景,并通过动态规划方法解决最大收益问题。文章介绍了buy、sell和rest三个状态的概念及其递推公式,并提供了一个C++程序示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目分析:

  • 用一个数组表示股票每天的价格,数组中第i个数表示股票在第i天的价格。 可以进行多次交易,但在存在两个限制条件:1)不可以同时进行多次交易(必须卖出股票前再买一次股票);2)售出股票后,不能在第二天在买股票(冷冻期);求此时的最大收益。

解题思路:

  • 动态规划求解

    此题原前面题目的最大区别在于,股票交易过程中存在冷冻期,即如果某天买了股票,那么第二天不能买股票。解题过程中需要维护三个数组:buy,sell,rest。其中:

    • buy[i]表示在第i天之前最后一个操作是买,此时的最大收益。
    • sell[i]表示在第i天之前最后一个操作是卖,此时的最大收益。
    • rest[i]表示在第i填之前最后一个操作是冷冻期,此时的最大收益。

    对应递推公式为:

    • buy[i] = max(rest[i 1] price, buy[i 1])
    • sell[i] = max(buy[i 1] + price, sell[i 1])
    • rest[i] = max(sell[i 1], buy[i 1], rest[i 1])

    由于不可能出现buy rest buy情况,故三个递推式可以精简到两个,即为:

    • buy[i] = max(rest[i 2] price, buy[i 1])
    • sell[i] = max(buy[i 1] + price, sell[i 1])
  • 实现程序

    class Solution
    {
        public:
            int maxProfit(vector<int> &prices)
            {
                int buy = INT_MIN;
                int pre_buy = 0;
                int sell = 0;
                int pre_sell = 0;
                for (int i = 0; i < prices.size(); i++)
                {
                    pre_buy = buy;
                    // 买的情况 
                    buy = max(pre_sell - prices[i], pre_buy);
                    pre_sell = sell;
                    // 卖的情况 
                    sell = max(pre_buy + prices[i], pre_sell);
                }
                return sell;
            }
    };
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值