代码随想录算法训练营第四十九天| 123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

目录

题目链接:123.买卖股票的最佳时机III

思路

代码

题目链接:188.买卖股票的最佳时机IV

思路

代码

总结


题目链接:123.买卖股票的最佳时机III

思路

        与之前买卖股票不同的是本题要求最多买卖两次,那么dp数组以及递推公式都有所改变。

        ①dp数组,dp[i][j]表示第i天剩余的最大金币,j表示操作状态:

                0表示无操作

                1表示第一次持有股票

                2表示第一次不持有股票

                3表示第二次持有股票

                4表示第二次不持有股票

                五种状态都是依次连续的:

                        无操作->第一次持有->第一次不持有->第二次持有->第二次不持有

        ②递推公式,要包含上述五种状态的更新

                dp[i][0] = dp[i-1][0] 无操作与前一天保持一样

                dp[i][1] = max(dp[i-1][1], dp[i-1][0] - price[i]) 可能之前就买过;如果没买,说明之前都是无操作的状态

                dp[i][2] = max(dp[i-1][2], dp[i-1][1] + price[i]) 可能之前就卖了;如果没卖,说明第一次买的还在,今天卖

                dp[i][3] = max(dp[i-1][3], dp[i-1][2] - price[i]) 可能进行了一次买卖后,第二次买入了;如果没买,说明已经进行了第一次的股票买卖,还没进行第二次

                dp[i][4] = max(dp[i-1][4], dp[i-1][3] + price[i]) 可能将第二次买的股票卖了,或者今天卖

        ③dp数组初始化

                dp[0][0] = 0 无操作就是0

                dp[0][1] = -price[i] 第一天持有,表示第一天买入,减去当天股票价格

                dp[0][2] = 0 第一天不持有,表示没有买入,还是0

                dp[0][3] = -price[i] 与第一次情况相同,可以认为第一天买了又卖了,现在是第二次

                dp[0][4] = 0 第二次不持有,表示没有买入,还是0

        ④遍历顺序,正序遍历,因为所有的状态更新都依赖于前一天

        ⑤推导dp数组

代码

class Solution {
public:
    // dp数组第一维表示第i天,第二维表示状态
    // 0表示无操作
    // 1表示第一次持有
    // 2表示第一次不持有
    // 3表示第二次持有
    // 4表示第二次不持有
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        if (len == 1)
            return 0;
        vector<vector<int>> dp(len, vector<int>(5, 0));
        // dp数组初始化
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        dp[0][2] = 0;
        dp[0][3] = -prices[0];
        dp[0][4] = 0;
        for (int i = 1; i < len; i++) {
            // 五种状态的更新
            dp[i][0] = dp[i - 1][0];
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
            dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
            dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
            dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
        }
        return dp[len - 1][4];
    }
};

题目链接:188.买卖股票的最佳时机IV

思路

        原理与123.买卖股票的最佳时机Ⅲ相同,可以买卖k次,创建dp数组时,第二维空间2k+1,初始化以及状态更新时用for循环。

代码

class Solution {
public:
    // dp数组第一维表示第i天
    // 第二维奇数表示第j次持有,偶数表示第j次不持有,0表示无操作
    int maxProfit(int k, vector<int>& prices) {
        int len = prices.size();
        if (len == 1)
            return 0;
        // 每次交易都包含持有和未持有两种状态,还有0表示无操作,所以共计2*k+1个状态
        int s = 2 * k + 1;
        vector<vector<int>> dp(len, vector<int>(s, 0));
        // dp数组初始化,j从到2*k
        for (int j = 0; j < s; j++) {
            if (j % 2 == 1) {
                dp[0][j] = -prices[0];
            } else {
                dp[0][j] = 0;
            }
        }
        // dp数组状态更新
        for (int i = 1; i < len; i++) {
            dp[i][0] = dp[i - 1][0]; // 无操作单独赋值
            for (int j = 1; j < s; j++) {
                // 奇数表示持有,偶数表示未持有
                // 每种状态都由前一天推导而来,涉及前一天的当前状态和前一种状态
                if (j % 2 == 1) {
                    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);
                } else {
                    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i]);
                }
            }
        }
        return dp[len - 1][2 * k];
    }
};

总结

        ①买卖股票Ⅰ和Ⅱ分别是只能买卖一次和不限次数的买卖;买卖股票Ⅲ和Ⅳ分别是只能买卖两次和买卖k次。相同点是当天的状态只能由昨天推导而来,不同点是状态的多少

        ②看了买卖股票Ⅲ的题解,AC后,单独完成了买卖股票Ⅳ,规律性很强

        ③在做这类题时,最重要的是搞清楚dp数组的含义,并且要包含所有的状态

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

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

相关文章

宏集Panorama SCADA软件获BACnet BTL认证

Panorama 获得BACnet BTL认证 建筑物的组件&#xff08;空调系统、照明传感器等&#xff09;能否使用共同通讯协议&#xff1f;这正是标准化 BACnet协议&#xff08;Building Automation and Control Networks&#xff09;所提供的功能。该协议旨在实现建筑物中各种设备和系统…

初探 JUC 并发编程:读写锁 ReentrantReadWriteLock 原理(8000 字源码详解)

本文中会涉及到一些前面 ReentrantLock 中学到的内容&#xff0c;先去阅读一下我关于独占锁 ReentrantLock 的源码解析阅读起来会更加清晰。 初探 JUC 并发编程&#xff1a;独占锁 ReentrantLock 底层源码解析 6.4&#xff09;读写锁 ReentrantReadWriteLock 原理 前面提到的 R…

谈基于ATTCK框架的攻击链溯源

引言 网络安全在当今数字化时代变得尤为关键&#xff0c;而MITRE公司开发的ATT&CK框架则成为了安全专业人员的重要工具。ATT&CK是一种广泛使用的攻击行为分类和描述框架。其目的在于提供一个共同的语言&#xff0c;使安全专业人员能够更好地理解攻击者的行为和目标&…

整理好了!咸阳市各区县高新技术企业申报奖补标准,高企认定时间流程及申报条件

咸阳市及各区县高企申报奖励 咸阳市&#xff1a;对首次通过认定的高新技术企业给予20万元的奖励&#xff0c;通过复审的企业给予5万元奖励。政策依据&#xff1a;咸阳市人民政府办公室关于印发《咸阳市科技型企业三年倍增计划实施方案&#xff08;2022—2024年&#xff09;》的…

如何在您的WordPress网站上安装和设置W3 Total Cache

本周有一个客户&#xff0c;购买Hostease的虚拟主机&#xff0c;询问我们的在线客服&#xff0c;如何在您的WordPress网站上安装和设置W3 Total Cache&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff…

【2022 深圳 ArchSummit 】大数据架构稳定性保障实践

文章目录 一、前言二、现状三、大数据架构的历史变迁&#xff08;一&#xff09;洪荒期&MR&#xff08;二&#xff09;远古期&MPP&#xff08;四&#xff09;近现代&Flink/Spark&#xff08;五&#xff09;现如今&实时数据湖架构 四、架构稳定的关键因素&#…

学习100个Unity Shader (17) --- 深度纹理

文章目录 效果shader部分C# 部分理解参考 效果 shader部分 Shader "Example/DepthTexture" {SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _CameraDepthTexture;struct a2v{float4 pos : POSITIO…

公司活动想找媒体报道宣传怎样联系媒体?

作为公司宣传负责人,我深知媒体报道对于企业活动宣传的重要性。然而,在过去,每当有重要活动需要媒体曝光时,我总会被繁琐的媒体联系工作所困扰。 那时,我需要一家家地查询媒体联系方式,发送邮件、打电话,甚至亲自前往媒体机构进行沟通。然而,这样的过程不仅费时费力,而且效率低…

Linux系统调用过程详解:应用程序调用驱动过程

Linux下应用程序调用驱动程序过程&#xff1a; &#xff08;1&#xff09;加载一个驱动模块(.ko)&#xff0c;产生一个设备文件&#xff0c;有唯一对应的inode结构体 a、每个设备文件都有一个对应的’inode‘结构体&#xff0c;包含了设备的主次设备号&#xff0c;是设备的唯一…

ChatGLM3-6B部署与微调及微调后使用

记录ChatGLM3-6B部署及官方Lora微调示例详细步骤及如何使用微调后的模型进行推理 一、下载代码 使用git clone 命令下载源码 git clone https://github.com/THUDM/ChatGLM3.git 如图所示 二、下载模型 模型权重文件从魔塔进行下载&#xff0c;不需要翻墙。权重文件比较大&…

搭建知识库必备:12个开源 Wiki 软件工具盘点

在任何成功的公司中&#xff0c;部门间的知识共享是至关重要的。如果没有一个简单的信息交流方法&#xff0c;团队怎样才能有效合作呢&#xff1f;Wiki软件提供了一种创建、组织及在全公司范围内分享知识的直接方法。但是&#xff0c;哪一种Wiki软件是最佳的选择呢&#xff1f;…

【计算机毕业设计】springboot工资管理系统

人类现已迈入二十一世纪&#xff0c;科学技术日新月异&#xff0c;经济、资讯等各方面都有了非常大的进步&#xff0c;尤其是资讯与 网络技术的飞速发展&#xff0c;对政治、经济、军事、文化等各方面都有了极大的影响。 利用电脑网络的这些便利&#xff0c;发展一套工资管理系…

Unity 修复Sentinel key not found (h0007)错误

这个问题是第二次遇到了&#xff0c;上次稀里糊涂的解决了&#xff0c;也没当回事&#xff0c;这次又跑出来了&#xff0c;网上找的教程大部分都是出自一个人。 1.删除这个路径下的文件 C:\ProgramData\SafeNet Sentinel&#xff0c;注意ProgramData好像是隐藏文件 2.在Windows…

Mac安装激活--Typora,一个比记事本更加强大的纯文本软件

一、安装 1.首先到官网下载Mac版的Typora,下载地址&#xff1a;https://typoraio.cn/ &#xff08;1&#xff09;打开默认中文站 &#xff08;2&#xff09;往下滑&#xff0c;下载Mac版 2.下载完成后&#xff0c;会看到Typora.dmg文件&#xff0c;点击打开文件 3.打开Typ…

mac苹果电脑卡顿反应慢如何解决?2024最新免费方法教程

苹果电脑以其稳定的性能、出色的设计和高效的操作系统&#xff0c;赢得了广大用户的喜爱。然而&#xff0c;随着时间的推移&#xff0c;一些用户会发现自己的苹果电脑开始出现卡顿、反应慢等问题。这不仅影响使用体验&#xff0c;还会影响工作效率。那么&#xff0c;面对这些问…

luceda ipkiss教程 68:通过代码模板提高线路设计效率

在用ipkiss设计器件或者线路时&#xff0c;经常需要输入: from ipkiss3 import all as i3那么有什么办法可以快速输入这段代码呢&#xff1f;这里就可以利用Pycharm的 live template功能&#xff0c;只需要将文件&#xff1a;ipkiss.xml &#xff08;luceda ipkiss教程 68&…

JetBrains的Java集成开发环境IntelliJ 2024.1版本在Windows/Linux系统的下载与安装配置

目录 前言一、IntelliJ在Windows安装二、IntelliJ在Linux安装三、Windows下使用配置四、Linux下使用配置总结 前言 ​ “ IntelliJ IDEA Ultimate是一款功能强大的Java集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地…

深入理解Java HashSet类及其实现原理

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

LabVIEW MEMS电容式压力传感器测试系统

LabVIEW MEMS电容式压力传感器测试系统 随着微电子技术的发展&#xff0c;MEMS&#xff08;微电机系统&#xff09;技术在各个领域得到了广泛应用。MEMS电容式压力传感器以其高灵敏度、小尺寸、低功耗等优点&#xff0c;在微传感器领域占据了重要的地位。然而&#xff0c;这些…

基于FPGA的音视频监视器,音视频接口采集器的应用

① 支持1路HDMI1路SDI 输入 ② 支持1路HDMI输出 ③ 支持1080P高清屏显示实时画面以 及叠加的分析结果 ④ 支持同时查看波形图&#xff08;亮度/RGB&#xff09;、 直方图、矢量图 ⑤ 支持峰值对焦、斑马纹、伪彩色、 单色、安全框遮幅标记 ⑥ 支持任意缩放画面&#xff0c;支…
最新文章