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

309.最佳买卖股票时机含冷冻期(中等)

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

思路

状态定义

一、很容易想到四种状态:

  • a.今天买入;
  • b.今天卖出;
  • c.昨天卖出,今天处于冷冻期,无法进行操作;
  • d.今天不操作,处于持有状态;

显然,a和d可以合并为持有状态,因此本题需要处理三种状态:「当天持有股票」、「当天不持有股票,卖出」、「当天不持有股票,处于冷冻期」。

二、状态表示

使用三个一维数组来表示这三种状态:

  • have[i]:第 i 天持有股票的最大收益;
  • sell[i] : 第 i 天售出股票的最大收益;
  • freeze[i] :第 i 天为冷冻期的最大收益;

状态转移

在这里插入图片描述

  • 对于持有状态 have,它可以由两种情况得到:

    第一种是「昨天就持有股票,今天不进行任何操作」,所以今天的收益等于昨天持有股票的收益,即 have[i] = have[i-1];
    第二种是「昨天不属于冷冻期,今天选择买入」,所以今天的收益等于冷冻期后的收益扣去今天的股票价格,即have[i] = freeze[i-1]-prices[i];

    要使得收益最大化,所以持有状态的收益就是两种情况下的最大收益,即 have[i] = max(have[i-1], freeze[i-1]-prices[i]);

  • 对于卖出状态,它只能由持有状态得到:「昨天持有股票,今天将其售出」,所以收益是昨天持有股票的收益加上今天的股票价格,即:sell[i] = have[i-1] + prices[i];

  • 对于冷冻期状态,它可以由两种情况得到:

    第一种是「昨天售出,进入冷冻期」,所以收益就是昨天售出股票后的收益,即freeze[i] = sell[i-1];
    第二种是「昨天是冷冻期,不持有任何股票,今天仍然不进行买入操作,所以保持在冷冻期」,那么收益就是昨天冷冻期的收益,即freeze[i] = freeze[i-1];

    同样地,要使得收益最大化,所以冷冻期的收益就是两种情况下的最大收益,即 freeze[i] = max(sell[i-1], freeze[i-1]);

初始化

  • have[0] = -prices[0]; :第0天要持有股票,那么一定需要选择买入价格为 prices[0] 的股票;
  • sell[0] = 0 :第0天要售出,且不持有股票,那么当天一定是买卖同一支股票,收益为 0;
  • freeze[0] = 0:第 0 天处于冷冻期,可以理解为不进行任何操作,即不买不卖,所以收益为 0。

最终的返回结果

最大收益一定是完成交易(即不持有股票) 的情况,所以返回 sell[n-1]freeze[n-1] 的最大值 。

易错点

  • 这道题可以多次买卖同一股票,因此初始化条件和之前的题目不一样,第 0 天处于 sell 和 freeze 状态也是合法状态,应该设为 0。
  • 对于持有状态,包含两种情况,也可以单独考虑,但稍显繁琐。

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() <= 1)  return 0;
        int n = prices.size();
        vector<int> have(n), sell(n), freeze(n);

        // 初始化
        have[0] = -prices[0];
        sell[0] = freeze[0] = 0;

        for(int i=1; i<n; ++i){
            have[i] = max(have[i-1], freeze[i-1]-prices[i]);
            sell[i] = have[i-1] + prices[i];
            freeze[i] = max(sell[i-1], freeze[i-1]);
        }
        return max(sell[n-1], freeze[n-1]);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/16020.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

太酷了,库昊

昨天晚上凌晨3点30&#xff0c;勇士和国王的第7场比赛开打。 在上一局在勇士主场干翻勇士后&#xff0c;国王队的信心倍增&#xff0c;他们用自己的节奏一次次击溃勇士&#xff0c;特别是今天的前两节&#xff0c;国王能能够回应勇士的进球&#xff0c;防守也更有侵略性。今天不…

图扑数字孪生助力智慧冷链园区实现大数据实时监控

前言 近年来&#xff0c;业界学者及企业就智慧冷链物流展开深入研究&#xff0c;2010 年 IBM 发布的《智慧的未来供应链》研究报告中提出智慧供应链概念&#xff0c;并由此延伸出智慧物流概念&#xff0c;即智慧物流是以信息化为依托并广泛应用物联网、人工智能、大数据、云计…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】D 题 航空安全风险分析和飞行技术评估问题 27页论文及代码

【2023 年第十三届 MathorCup 高校数学建模挑战赛】D 题 航空安全风险分析和飞行技术评估问题 27页论文及代码 1 题目 D 题 航空安全风险分析和飞行技术评估问题 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快速发展&#xff0c;针对飞行安全问题的研究显得…

巧用千寻位置GNSS软件| 桥台锥坡放样操作技巧

桥台锥坡放样是针对道路施工中&#xff0c;路桥结合部桥台圆锥形斜坡面进行放样设计的专用程序。本期将给大家介绍如何使用千寻位置GNSS软件实现快速完成桥台锥坡放样。 点击【测量】->【桥台锥坡放样】&#xff0c;从线路库中选择桥台经过的线路或是单独增加桥台 锥坡放样&…

QML动画分组(Grouped Animations)

通常使用的动画比一个属性的动画更加复杂。例如你想同时运行几个动画并把他们连接起来&#xff0c;或者在一个一个的运行&#xff0c;或者在两个动画之间执行一个脚本。动画分组提供了很好的帮助&#xff0c;作为命名建议可以叫做一组动画。有两种方法来分组&#xff1a;平行与…

【无功功率控制】连接到无限电网的小型风电场的无功功率控制(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

jvm之字节码

写在前面 java字节码由单字节的指令(也叫做操作码)组成&#xff0c;但一个 byte 最多能够存储 256 个指令&#xff0c;够用吗&#xff1f;截止到目前是够的&#xff0c;因为指令的个数是200多一点&#xff0c;指令分为如下四类&#xff1a; 1&#xff1a;栈操作指令&#xff…

SmartEngine流程引擎之Custom模式

目录 一、为什么选用SmartEngine 二、各类流程引擎框架简单对比 1、流程设计器推荐 2、什么是BPMN 流程定义解释说明 三、SmartEngine之Custom实操 1、引入依赖 2、典型的初始化代码如下 3、节点如何流转以及流程实例存储问题 4、定义Delegation 关键类 一、为什么选用…

Java 基础入门篇(四)—— 方法的重载与参数传递机制

文章目录 一、方法的定义二、方法的参数传递机制 ★2.1 基本类型的参数传递2.2 引用类型的参数传递 三、方法重载 一、方法的定义 方法的作用&#xff1a;封装一段代码的语法结构&#xff0c;可以被重复调用&#xff0c;以此提高代码的复用性&#xff0c;提高开发效率&#xf…

ChatGPT Plus价格太贵,可以约上三五知己一起上车体验一下,这个项目就能帮到你

对于想体验ChatGPT PLus的小伙伴&#xff0c;可能觉得自己一个人一个月花费20美元&#xff0c;相对于人民币每月137多&#xff0c;确实是一个不少的开支&#xff0c;如果&#xff0c;几个人合作一个账号&#xff0c;这样负担就减少了。刚好&#xff0c;最近逛github发现刚好有一…

小记Java调用C++开发的动态链接库(DLL)

一、背景 五一快乐吖&#xff01;死肥宅正趁着五一这段时间&#xff0c;努力提升自己&#xff01; 最近使用Java拦截Windows系统中一些默认事件时&#xff0c;发现了一些瓶颈。 我用Java操作浏览器、用Java最小化其他应用窗口&#xff0c;但是我发现这个操作&#xff0c;他都…

几十个简要的游戏案例分析

文章目录 一、 介绍二、 影响游戏体验的因素三、 游戏能爆火的因素1.影响游戏爆火因素的排名2.玩游戏的两种经典心理3.经典案例分析Qq农场植物大战僵尸水果忍者召唤神龙羊了个羊 4.游戏公司可借鉴的经验 四、 几十款游戏的多方面分析FC红白游戏机十二人街霸热血高校系列魂斗罗系…

趣说数据结构(练习1) —— 顺序表/链表力扣刷题

练习 1 —— 顺序表/链表力扣刷题 1. 合并两个有序链表 力扣题目地址&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists/ 问题描述&#xff1a;将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#x…

Java——Java面向对象

该系列博文会告诉你如何从入门到进阶&#xff0c;一步步地学习Java基础知识&#xff0c;并上手进行实战&#xff0c;接着了解每个Java知识点背后的实现原理&#xff0c;更完整地了解整个Java技术体系&#xff0c;形成自己的知识框架。 概述&#xff1a; Java是面向对象的程序…

@Autowired与@Resource原理知识点详解

文章目录 前言springIOC依赖注入的三种方式属性注入&#xff08;字段注入&#xff09;构造方法注入setter注入用哪个&#xff1f; Autowired实现原理 Resource实现原理结论 Autowired与Resource的不同来源不同参数不同使用不同装配顺序 前言 现在spring可以说是一统天下了&…

【Unity-UGUI控件全面解析】| Canvas 画布组件详解

🎬【Unity-UGUI控件全面解析】| Canvas 画布组件详解一、组件介绍1.1 绘制元素的顺序二、组件属性面板2.1 Canvas :画布,控制UI的渲染模式2.2 Canvas Scaler:画布缩放器,控制UI画布的放大缩放的比例2.3 Graphic Raycaster:图形射线投射器,控制是否让UI响应射线点击三、…

【干货分享】一文说透分布式一致性协议(上)

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;大熊老师 | 慕课网讲师 在常见的分布式系统中&#xff0c;总会发生诸如机器宕机或网络异常&#xff08;包括消息的延迟…

数据备份系列:Rsync 备份详解(一)

一、Rsync 简介 1.1 Rsync 是一个远程增量文件备份软件工具 1.2 Rsync 的特性 支持拷贝特殊文件&#xff0c;如连接文件、设备等。可以有排除指定文件或目录同步的功能&#xff0c;相当于打包命令 tar 的排除功能。可以做到保持原文件或目录的权限、时间、软硬链接、属主、组…

Python每日一练(20230502)

目录 1. 被围绕的区域 &#x1f31f;&#x1f31f; 2. 两数之和 II &#x1f31f; 3. 二叉树展开为链表 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1…

react native ios 添加启动页 xcode14 react-native-splash-screen

最近更新xcode&#xff0c;有些配置有些不同&#xff0c;网上查的方法都是过时的&#xff0c;导致配了一段时间卡在这里&#xff0c;最后访问官网才弄好了&#xff0c;所以以后解决问题的办法先看官网再查其他各路神仙的办法。 官网的步骤&#xff1a;https://github.com/crazy…