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

题目:

309. 最佳买卖股票时机含冷冻期
在这里插入图片描述

题解:动态规划

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:动态规划

1. 代码一:常规代码

public class code309 {

    public static int maxProfit(int[] prices) {
        if(prices.length == 0)
        {
            return 0;
        }
        int n = prices.length;
        // dp[i][0]: 手上持有股票的最大收益
        // dp[i][1]: 手上不持有股票,并且处于冷冻期中的累计最大收益
        // dp[i][2]: 手上不持有股票,并且不在冷冻期中的累计最大收益
        int dp[][] = new int[n][3];
        dp[0][0] = -prices[0];
        for(int i = 1; i < n; i++)
        {
            // 对于 dp[i][0],我们目前持有的这一支股票可以是在第 i-1 天就已经持有的,对应的状态为 dp[i-1][0];
            // 或者是第 i 天买入的,那么第 i-1 天就不能持有股票并且不处于冷冻期中,对应的状态为 dp[i-1][2] 加上买入股票的负收益 prices[i]。
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2] - prices[i]);
            // 对于 dp[i][1],我们在第 i 天结束之后处于冷冻期的原因是在当天卖出了股票,那么说明在第 i-1 天时我们必须持有一支股票,
            // 对应的状态为 dp[i-1][0] 加上卖出股票的正收益 prices[i]。
            dp[i][1] = dp[i - 1][0] + prices[i];
            // 对于 dp[i][2],我们在第 i 天结束之后不持有任何股票并且不处于冷冻期,说明当天没有进行任何操作,即第 i−1 天时不持有任何股票:
            // 如果处于冷冻期,对应的状态为 dp[i-1][1];如果不处于冷冻期,对应的状态为 dp[i-1][2]。
            dp[i][2] = Math.max(dp[i - 1][1], dp[i - 1][2]);
        }
        // 如果在最后一天(第 n-1 天)结束之后,手上仍然持有股票,那么显然是没有任何意义的。
        // 因此更加精确地,最终的答案实际上是 dp[n-1][1] 和 dp[n-1][2] 中的较大值。
        return Math.max(dp[n - 1][1], dp[n - 1][2]);
    }

    public static void main(String[] args) {
        int prices[] = { 1, 2, 3, 0, 2 };
        int res = maxProfit(prices);
        System.out.println(res);
    }
}

2. 代码二:空间优化

class Solution {
    public int maxProfit(int[] prices) {
        if (prices.length == 0) {
            return 0;
        }

        int n = prices.length;
        int f0 = -prices[0];
        int f1 = 0;
        int f2 = 0;
        for (int i = 1; i < n; ++i) {
            int newf0 = Math.max(f0, f2 - prices[i]);
            int newf1 = f0 + prices[i];
            int newf2 = Math.max(f1, f2);
            f0 = newf0;
            f1 = newf1;
            f2 = newf2;
        }

        return Math.max(f1, f2);
    }
}

参考:

  1. 最佳买卖股票时机含冷冻期
  2. 动态规划
  3. 一图秒懂解法
  4. 图解』DP 思路,学习了状态机的解法
  5. 状态机模型DP
  6. 非状态机的DP讲解,全新思路,超通俗易懂,包你一遍看懂
  7. Java最容易理解的动态规划,初学者也能看懂
  8. 最佳买卖股票时机含冷冻期python3动态规划
  9. 【309. 最佳买卖股票时机含冷冻期】:详解DP、空间优化
  10. 动态规划,在dp[][]的第二维中加入冷冻的情况
  11. 字节题库中等5:买卖股票的最佳时机含冷冻期(两种方法)
  12. 小白都能看懂的方法~动态规划详解
  13. 309. 最佳买卖股票时机含冷冻期 - 击败 100%
  14. 动态规划深入分析
  15. 算法-贪心/动态规划-买卖股票的最佳时机
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dev_zyx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值