2021-11-11 leetcode动态规划 309.最 佳买卖股票时机含冷冻期 c++

题目

leetcode 309.最佳买卖股票时机含冷冻期
请添加图片描述
重点
第i天卖出股票,则第i+1天不允许买股票。

此题和leetcode 714.买卖股票的最佳时机含手续费类似,但将手中无股票的状态进一步细分。

思路

动态规划
以下确定状态转移方程

定义

重点转移至股票卖出那一天,而非冷冻期。第i天能买股票取决于第i-1天是否卖出。

(1)手中有股票的情况
dp[i][0] 第i天交易完成时,手中有股票的情况下所获得的利益最大值

(2)手中没有股票的情况
dp[i][1] 在第i-1天手中本来就没有股票,使得第i天手中也没有股票的情况下,这是第i天无卖出交易行为所获利益最大值
dp[i][2]在第i-1天手中有股票,但在第i天卖出了股票的情况下,这是第i天有卖出交易行为所获利益最大值

理由及解释

(1)手中有股票的情况,第i天的利润来源的两种情况
i) 在第i-1天交易完成时,手中就有股票了,此时的利润为第i-1天有股票时的利润最大值
ii)在第i-1天时手中没有股票,但在第i天买了股票,所以现在手中有股票,此时的利润为第i-1天没有股票且无卖出情况的利润最大值 - 第i天股票的价格

(2)手中没有股票的情况

i)第i天无无卖出,第i天利润来源的两种情况
1:第i-1天手中本来就没有股票,第i天的利润为第i-1天无卖出的利润最大值
2:第i-1天手中本来有股票,但在第i-1天卖出,则第i天手中没有股票。因此第i-1天卖出的利润最大值

ii)第i天有卖出,则第i天的利润来源的情况
第i天手中本来有股票,但卖出了,则第i天的利润为第i-1天手中有股票的利润 + 第i天股票卖出的价格

状态转移方程

(1) 手中持股的情况
dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[I]);

(2)手中不持股的情况
i)无卖出
dp[i][1] = max(dp[i-1][1], dp[i-1][2]);
ii) 有卖出
dp[i][2] = dp[i-1][0] + prices[I]

状态转移方程初始化

dp[0][0] = -prices[0]
dp[0][1] = 0
dp[0][2] = 0

AC代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        int dp[n][3];
        //初始化
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        dp[0][2] = 0;
        for(int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]  - prices[i]);//持股
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][2]);//不持股,无卖出
            dp[i][2] = dp[i - 1][0] + prices[i];//不持股,有卖出
        }
        return max(dp[n - 1][1], dp[n - 1][2]);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聪明的Levi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值