169、【动态规划】leetcode ——123. 买卖股票的最佳时机 III:二维数组+一维数组 (C++版本)

news2024/11/16 15:52:37

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原题链接:123. 买卖股票的最佳时机 III

解题思路

(1)二维dp数组

  • 动态规划五步曲:

(1)dp数组含义: dp[i][0],表示无操作。主要由四个状态来表示四种操作。dp[i][1],表示在第i天时,已经第一次持有过股票时,具有的最大收益。dp[i][2],表示在第i天时,已经第一次不持过有股票票时,具有的最大收益。dp[i][3],表示在第i天时,已经第二次持有过股票票时,具有的最大收益。dp[i][4],表示在第i天时,已经第二次不持有过股票票时,具有的最大收益。

(2)递推公式:

  1. dp[i][1] = max(dp[i - 1][1], -prices[i]),表示在之前已第一次持有股票和第i天第一次持有股票中,找一个最大值,作为最大收益。

  2. dp[i][2] = max(dp[i - 1][2], dp[i][1] + prices[i]),表示在之前已第一次不持有股票和第i天把股票售出后中,找一个最大值,作为最大收益。

  3. dp[i][3] = max(dp[i - 1][3], dp[i][2] + prices[i]),表示在之前已第二次不持有股票和第i天第二次持有股票中,找一个最大值,作为最大收益。这里注意,第i天时,第二次持有股票要从第一次不持有股票(第一次售出股票)后的状态得来。

  4. dp[i][4] = max(dp[i - 1][4], dp[i][3] + prices[i]),表示在之前已第二次不持有股票和第i天把股票售出后中,找一个最大值,作为最大收益。

(3)dp数组初始化: dp[0][0] = 0,遍历后续计算。dp[0][1] = -prices[0],第一天购买股票,总收益减去当天股价。dp[0][2] = 0,第一次不持有,就相当于当天买当天卖。dp[0][3] = -prices[0],第二次购买股票,相当于第一天买卖后,又买一次。dp[0][4] = 0,第二次卖出。

(4)遍历顺序: 从小到大。

(5)举例:
image.png

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> dp(n + 1, vector<int>(5));   
        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 < n; i++) {            
            dp[i][1] = max(dp[i - 1][1], - 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[n - 1][4];
    }
};

(2)变量优化一维dp数组

  1. dp[i][1] = max(dp[i - 1][1], - prices[i])主要取决于i-1时情况和当下买入情况,可优化为dp[1] = max(dp[1], - prices[i]),每次到第i次遍历时,max中的dp[1]就相当于是第i-1次时计算得到的结果,取完最大值后,dp[1]就变为了dp[i][1]

  2. dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]),同上取决于dp[i-1][2]和dp[i-1][prices[i]],可优化为dp[2] = max(dp[2], dp[1] + prices[i])。如果是dp[i-1][2]大的话,直接得出即可。如果是dp[i-1][prices[i]]大的话,若上一条代码执行的是dp[i][1]=-prices[i],此时若再次执行该条代码就会在同一天进行依次买卖,最终变为0。但在实际代码运行中并不会这样执行,除非prices数组中都为0。

  3. dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]),同理可优化为dp[3] = max(dp[3], dp[2] - prices[i])

  4. dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]),同理可优化为dp[4] = max(dp[4], dp[3] + prices[i])

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<int> dp(5);   
        dp[0] = 0;
        dp[1] = -prices[0], dp[2] = 0;
        dp[3] = -prices[0], dp[4] = 0;

        for(int i = 1; i < n; i++) {            
            dp[1] = max(dp[1], - prices[i]);
            dp[2] = max(dp[2], dp[1] + prices[i]);
            dp[3] = max(dp[3], dp[2] - prices[i]);
            dp[4] = max(dp[4], dp[3] + prices[i]);
        }

        return dp[4];
    }
};

参考文章:123. 买卖股票的最佳时机 III

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

博客系统web自动化测试

目录 一、项目简介 二、测试用例 三、测试过程 3.1 环境搭建 3.2 编写代码 3.2.1 博客登陆页面测试 3.2.2 博客列表页面测试 3.2.3 博客详情页面测试 3.2.4 博客编辑页面测试 四、测试评估 一、项目简介 本项目是一个简易的个人博客系统&#xff0c;用户可以在登陆后…

W800开发板|SDK| HLK-W800-KIT-PRO|工具链|本地命令行编译|Windows11|WSL|(5)、海凌科W800开发板命令行编译指南

概况 海凌科W800开发板&#xff08;HLK-W800-KIT&#xff09;是海凌科电子面向开发者针对联盛德W800 芯片推出的一款多功能开发板。全功能版本与联盛德W800开发板相比&#xff0c;增加了温湿度传感器、RGB 灯以及音频解码器、功放可以直接在开发版验证功能。联盛德W800的csdk也…

java虚拟机内存分布

java虚拟机内存分布 Java虚拟机在执行java程序的过程中会把它所管理的内存划分为如下若干个不同的数据区域。 1.程序计数器 程序计数器是线程私有的&#xff0c;它占用的空间相对较小&#xff0c;用来记录当前线程字节码执行到哪一步。字节码解释器通过改变这个计数器的值来获…

Portraiture2023最新版人像图像后期处理软件

2023全新发布Portraiture 4是专注于图像后期处理软件研发的 Imagenomic, LLC产品之一&#xff0c;在摄影爱好者中有点影响力。Portraiture可以将繁琐复杂的人像磨皮操作极致简化&#xff0c;不论是普通爱好者或专业后期处理人员&#xff0c;均能一键完成。凭借优秀的AI算法和多…

uniapp 悬浮窗(应用内、无需授权) Ba-FloatWindow2

简介&#xff08;下载地址&#xff09; Ba-FloatWindow2 是一款应用内并且无需授权的悬浮窗插件。支持多种拖动&#xff1b;自定义位置、大小&#xff1b;支持动态修改。 支持自动定义起始位置支持自定义悬浮窗大小支持贴边显示支持多种拖动方效果&#xff1a;不可拖动、任意…

python--matplotlib(1)

前言 Matplotlib画图工具的官网地址是 http://matplotlib.org/ Python环境下实现Matlab制图功能的第三方库&#xff0c;需要numpy库的支持&#xff0c;支持用户方便设计出二维、三维数据的图形显示。 正文 1.arange函数 arange函数需要三个参数&#xff0c;分别为起始点、终止…

MyBatisPlus ---- 多数据源

MyBatisPlus ---- 多数据源1. 创建数据库及表2. 引入依赖3. 配置多数据源4. 创建用户service5. 创建商品service6. 测试适用于多种场景&#xff1a;纯粹多库、读写分离、一主多从、混合模式等 目前我们就来模拟一个纯粹多库的一个场景&#xff0c;其他场景类似 场景说明&#x…

一文了解Hotspot虚拟机下JAVA对象从创建到回收的生命周期

Java虚拟机是Java的核心和基础&#xff0c;他是Java编译器和操作系统平台之间处理器&#xff0c;能实现跨平台运行Java程序。本文主要讲解的是虚拟机如何管理对象&#xff0c;即Java对象在JVM虚拟机中被创建到回收的流程 Java对象从创建到回收的生命周期对象创建流程1.类加载检…

MyBatis 的一级、二级缓存机制

目录标题缓存什么是缓存为什么使用缓存什么样的数据能使用缓存&#xff0c;什么样的数据不能使用适用于缓存不适用于缓存MyBatis 一级缓存、二级缓存关系1. 一级缓存1.1 什么是一级缓存mybatis1.2 一级缓存配置1.3 什么情况下会命中一级缓存mybatis清除一级缓存的几种方法1.4 内…

Delphi 10.4.2使用传统代码提示方案(auto complete)(转)

Delphi 10.4重点是实现了LSP&#xff0c;但现在最新的10.4.2还是不成熟&#xff0c;无法满足日常需要&#xff0c;不过没关系&#xff0c;可以设置为原有的方案&#xff0c;如下图&#xff1a;具体操作&#xff1a;Tools->Options->Editor->language->Code Insight…

迷宫问题图解 : 基于骨架提取、四邻域

目录 1. 迷宫的连通域 2. How to remove branch &#xff1f; 3. 基于4邻域的 remove 分支 3.1 找到分支的端点 3.2 4邻域的 remove 分支 3.3 循环移除分支 3.4 code 4. 迷宫路线 4.1 预处理 4.2 提取骨架 4.3 分支的端点 4.4 去除分支的端点 4.5 循环去除分支 4…

Java-合并两个链表

每日一题 Java-合并两个链表 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。 请你将 list1 中下标从 a 到 b 的全部节点都删除&#xff0c;并将list2 接在被删除节点的位置。 下图中蓝色边和节点展示了操作后的结果&#xff1a; 请你返回结果…

linux下redis安装 及常用命令

安装及常用命令 redis的yum方式安装 先查看是否已经安装redis执行命令 rpm -qa | grep redis如果存在&#xff0c;将存在的卸载&#xff1a;(-y 代表自动选择) yum remove xxx -y在线安装redis yum install redis安装本地已经下载好的redis安装包 yum localinstall redis6.2…

基于Spring、Spring MVC、MyBatis的招聘管理系统

文章目录项目介绍主要功能截图&#xff1a;首页账户管理招聘建议部分代码展示设计总结项目获取方式&#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 …

流程引擎之Camunda简介

背景Camunda 是支持 BPMN&#xff08;工作流和流程自动化&#xff09;、CMMN&#xff08;案例管理&#xff09; 和 DMN&#xff08;业务决策管理&#xff09; java 框架。Camunda 基于Activiti5 保留了 PVM&#xff0c;其开发团队也是从 activiti 中分裂出来的。Camunda 来自拉…

KubeSphere实战

文章目录一、KubeSphere平台安装1、Kubernetes上安装KubeSphere1.1 安装docker1.2 安装Kubernetes1.3 前置环境之nfs存储1.4 前置环境之metrics-server1.5 安装KubeSphere2、Linux单节点部署KubeSphere3、Linux多节点部署KubeSphere(推荐)二、KubeSphere实战1、多租户实战2、中…

Spring中的数据校验--进阶

分组校验 场景描述 在实际开发中经常会遇到这种情况&#xff1a;添加用户时&#xff0c;id是由后端生成的&#xff0c;不需要校验id是否为空&#xff0c;但是修改用户时就需要校验id是否为空。如果在接收参数的User实体类的id属性上添加NotNull&#xff0c;显然无法实现。这时…

【飞桨AI-Python小白逆袭大神课程】作业3-《青春有你2》选手数据分析

目录 一、数据准备 1、文件数据以json文件格式保存&#xff1a; 二、数据分析 2、数据分析四剑客&#xff1a; &#xff08;1&#xff09;Numpy &#xff08;2&#xff09;pandas &#xff08;3&#xff09;Matplotlib &#xff08;4&#xff09;PIL &#xff08;5&#x…

操作系统题目收录(十一)

1、操作系统采用分页存储管理方式&#xff0c;要求&#xff08;&#xff09;。 A&#xff1a;每个进程拥有一张页表&#xff0c;且进程的页表驻留在内存中B&#xff1a;每个进程拥有一张页表&#xff0c;但只有执行进程的页表驻留在内存中C&#xff1a;所有进程共享一张页表&a…

django项目实战(django+bootstrap实现增删改查)

目录 一、创建django项目 二、修改默认配置 三、配置数据库连接 四、创建表结构 五、在app当中创建静态文件 六、页面实战-部门管理 1、实现一个部门列表页面 2、实现新增部门页面 3、实现删除部门 4、实现部门编辑功能 七、模版的继承 1、创建模板layout.html 1&…