LeetCode | C++ 动态规划——123.买卖股票的最佳时机III 、188.买卖股票的最佳时机IV

目录

  • 123.买卖股票的最佳时机III
  • 188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III

123题目链接
根据题意:最多可以完成 两笔 交易,即可以买卖股票一次,可以买卖两次,也可以不买卖

dp数组定义:

此时 一天就有五个状态

  1. 没有操作
  2. 第一次持有股票
  3. 第一次不持有股票
  4. 第二次持有股票
  5. 第二次不持有股票

dp[i] [j]中 i 表示第 i 天,j 为 [0 - 4] 五个状态,dp[i] [j]表示第 i 天状态 j 所剩最大现金。

递推公式:

  • 达到dp[i] [1]状态(第一次持有股票),有两个具体操作:

(1)第 i 天买入股票, dp[i] [1] = dp[i - 1] [0] - prices[i];

(2)第 i 天 没有操作,dp[i] [1] = dp[i - 1] [1];

选择两者 之间最大的, dp[i] [1] = max (dp[i - 1] [0] - prices[i], dp[i - 1] [1]);

  • 达到dp[i] [2] 状态(第一次不持有股票),也有两个操作:

(1)第 i 天卖出股票, dp[i] [2] = dp[i - 1] [1] + prices[i];

(2)第 i 天 没有操作,dp[i] [2] = dp[i - 1] [2];

选择两者 之间最大的,dp[i] [2] = max (dp[i - 1] [1] + prices[i], dp[i - 1] [2])

  • 达到dp[i] [3]状态(第二次持有股票),同样为两个操作:

(1)第 i 天 买入第二次买入股票, dp[i] [3] = dp[i - 1] [2] - prices[i];

(2)第 i 天 没有操作, dp[i] [3] = dp[i - 1] [3];

dp[i] [3] = max(dp[i - 1] [2] - prices[i], dp[i - 1] [3]);

  • 达到 dp[i] [4]状态(第二次不持有股票), 同样为两个操作:

(1)第 i 天 卖出 第二次买入的股票,dp[i] [4] = dp[i - 1] [3] + prices[i];

(2)第 i 天 没有操作,dp[i] [4] = dp[i - 1] [4];

dp[i] [4] = max(dp[i - 1] [3] + prices[i], dp[i - 1] [4])

dp 数组初始化

对 第 0 天的五个状态进行初始化

dp[0] [0] = 0;

dp[0] [1] = -prices[i];

dp[0] [2] = 0; 买入完 立即卖出

dp[0] [3] = -prices[i];

dp[0] [4] = 0;

遍历顺序
从前往后

注意:

获取的最大利润一定是 在卖完第二次持有的股票时,

就是有可能 第一次卖出的已经是最大值,此时 可以在当天立刻买入后再立刻卖出,也就是卖完第二次持有的股票这种情况包含了 卖完第一次持有股票这种情况。

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

188.买卖股票的最佳时机IV

188题目链接
该题 相当于是 对 123. 买卖股票的最佳时机 III题目的推广,从 题123 中 找出规律,整体思路与 题123 一致。

class Solution {
public:int maxProfit(int k, vector<int>& prices) {vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1));for (int i = 0; i <= 2 * k; i = i + 2) {dp[0][i] = 0;}for (int i = 1; i < 2 * k; i = i + 2) {dp[0][i] = -prices[0];}for (int i = 1; i < prices.size(); i++) {dp[i][0] = dp[i - 1][0];for (int j = 1; j <= 2 * k; j++) {if (j % 2 == 0) {dp[i][j] = max (dp[i - 1][j - 1] + prices[i], dp[i - 1][j]);}else {dp[i][j] = max (dp[i - 1][j - 1] - prices[i], dp[i - 1][j]);}}}return dp[prices.size() - 1][2 * k];}
};

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

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

相关文章

Web开发的富文本编辑器CKEditor介绍,Django有库ckeditor_uploader对它进行支持,django-ckeditor安装方法及使用注意事项

当需要在网页应用程序中提供富文本编辑功能时&#xff0c;CKEditor是一个流行的选择。CKEditor是一个开源的JavaScript富文本编辑器&#xff0c;它提供了强大的功能和用户友好的界面&#xff0c;使用户可以轻松创建和编辑格式化的文本内容。 以下是CKEditor的一些主要特性&…

kakfa 2.4.1 java的生产者client在发送消息前分配消息属于哪个分区源码

标题是否不是很熟悉&#xff0c;面试不得必问啊 KafkaProducer 1、客户端暴露出来可以让开发人员调用的发送消息的方法send2、send实际调用私有方法doSend获取集群信息(并且得到这条数据写哪个分区)2.1获取kafka服务端集群某个topic的元数据方法waitOnMetadata2.2根据消息是否指…

rabbitMQ杂记

消息队列应用场景 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量 削锋等问题实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性&#xff1a; 解耦&#xff1a; 异步&#xff1a; 削峰&#xff1a; 常…

再见RestTemplate,Spring 6.1新特性:RestClient 了解一下!

在最近发布的Spring 6.1 M2版本中&#xff0c;推出了一个全新的同步HTTP客户端&#xff1a;RestClient。用一句话来让Spring开发者认识RestClient的话&#xff1a;像WebClient一样具备流畅API的RestTemplate。 所以&#xff0c;RestClient的使命就是淘汰已经有14年历史的RestTe…

实习经历总结

写在前面&#xff1a; 临毕业前突发奇想打算找实习&#xff0c;由于准备不是很充分加上没有经验&#xff0c;海投了一些岗位&#xff0c;方向主要是测试开发&#xff0c;base主要是北京&天津。 一些公司的面试&#xff1a; 当时投了很多大厂&#xff0c;美团&#xff0c…

elasticsearch高级功能之跨集群复制CCR

CCR的作用(Cross-Cluster Replication&#xff0c;跨集群复制)常用的场景如何使用工作原理源码分析 CCR的作用(Cross-Cluster Replication&#xff0c;跨集群复制) CCR功能允许用户在不同的Elasticsearch集群之间同步索引数据。这对于实现跨集群复制、数据备份、灾难恢复和多数…

3.12 Bootstrap 超大屏幕(Jumbotron)

文章目录 Bootstrap 超大屏幕&#xff08;Jumbotron&#xff09; Bootstrap 超大屏幕&#xff08;Jumbotron&#xff09; 下面将讲解 Bootstrap 支持的另一个特性&#xff0c;超大屏幕&#xff08;Jumbotron&#xff09;。顾名思义该组件可以增加标题的大小&#xff0c;并为登陆…

详解Windows安装分布式版本控制系统git

文章目录 前言下载安装相关链接 前言 git是一个分布式版本控制软件&#xff0c;最初由Linux创作者Linus Torvalds创作&#xff0c;并于2015年以GPL许可协议发布。git易于学习&#xff0c;占用空间小&#xff0c;性能却快如闪电&#xff0c;可以快速、 高效的管理从小到大的项目…

uniapp-轮播图swiper根据内容图片高度自适应,解决获取图片高度不准确的问题

需求&#xff1a;轮播图swiper根据内容图片高度自适应 但是通过uniapp uni.createSelectorQuery的方法获取图片高度不正确&#xff0c;比如图片是100&#xff0c;获取是200&#xff0c;this.$nextTick也不能解决&#xff0c;setTimeout到是能解决&#xff0c;但是不稳定&#…

DeFi新篇章 | Sui上原生订单簿DeepBook正式上线

随着原生去中心化中央限价订单簿&#xff08; Central Limit Order Book&#xff0c;CLOB&#xff09;DeepBook的推出&#xff0c;Sui上的DeFi开启了新篇章。DeepBook由一群Sui贡献者共同构建&#xff0c;为新一代DeFi应用提供了一个稳定的流动性层。 通过DeepBook&#xff0c…

Kubernetes在数字化转型中的作用

Kubernetes在数字化转型中的作用 数字化转型是指在现代化社会中&#xff0c;利用数字技术来改变企业、组织或个人的业务模式、流程和价值创造方式的过程。这包括使用数字技术来提高效率、创新产品或服务、优化客户体验和开发新的业务模式等方面。数字化转型是一个全球性的趋势…

mac批量修改文件名为不同名字

mac批量修改文件名为不同名字怎么弄&#xff1f;很多小伙伴通过私信向我求助&#xff0c;用什么方法可以在mac电脑上批量修改文件名称&#xff0c;将大量文件修改成不同的名称。这可能是一项比较麻烦的操作&#xff0c;在电脑上进行过批量重命名的小伙伴都知道&#xff0c;一般…

Redis源码篇 - Reactor设计模式 和 Redis Reactor设计模式

Reactor &#xff1a;反应器模式或者应答者模式&#xff0c;它是一种基于事件驱动的设计模式。拥有一个或者多个输入源&#xff0c;通过反应器分发给多个worker线程处理&#xff0c;实现并发场景下事件处理。 此图网上找的&#xff0c;画的很好&#xff1a;

【Javascript】根据表达式(可字符串)过滤数组

正在实现一个基于后台低代码配置的应用&#xff0c;记录一下字符串表达式在项目用的转换与使用。以下是使用表达式过滤数据的实践代码: 表达式如下 item.readFlag1封装使用函数 /*** 获取表格数据* param array 被过滤的数组 * param expression 表达式*/ function filterAr…

C# 抽象类和接口详解

参考视频链接&#xff1a;https://www.bilibili.com/video/BV13b411b7Ht?p27&vd_source10065785c7e10360d831474364e0d3e3 代码的进化与重构&#xff0c;从基本代码的讲解到逐步抽象成抽象类和接口。 文章目录 最初定义利用继承改进对方法进一步改进利用虚函数进行改进利…

如何设计光场2.0(聚焦型光场相机)系统参数

1. 系统参数设计 目前的硬件系统的现状&#xff1a;主透镜50mm&#xff0c;MLA&#xff1a;15*15&#xff0c;d0.5mm&#xff0c;f15mm&#xff0c;s4.8um 开普勒型光场系统&#xff1a; 首先我们需要确定系统的M&#xff0c;M参数表示单个位置的点能被多少个小微透镜成像&am…

【YOLO】部署与推理

【YOLO】部署与推理 文章目录 【YOLO】部署与推理前言一、YOLO 的发展历史?一、YOLOv5 是什么?二、YOLOv5型号选择三、YOLOv5 推理1. 下载源代码2. 安装依赖2. 执行推理总结前言 目前YOLO最新的对象检测模型系列,最新版已经发展到YOLOv8, YOLOV8模型更快、更准确,具有实例…

python3GUI--仿win10任务管理器By:PyQt5(附UI源码)

文章目录 一&#xff0e;前言二&#xff0e;展示1.主界面1.进程2.性能1.CPU2.内存 3.简略信息4.详细信息5.新建任务 三&#xff0e;设计思路1.UI设计1.主界面1.进程2.性能3.详细信息4.新建任务5.图表信息组件 2.代码整体设计1.项目设计心得2.项目设计其他心得 3.其他心得 四&am…

Minecraft 1.20.x Forge模组开发 01.Idea开发环境配置

我们本次来进行Minecraft 1.20.x 模组开发环境配置教程的介绍。 效果演示 效果演示 效果演示 1.首先我们需要下载Java17和1.20模组开发包: Java17下载官网

智安网络|保护数据资产:不同行业下的数据安全建设策略

在当今数字化时代&#xff0c;数据安全已经成为各行各业无法忽视的重要议题。保持良好网络卫生习惯并及时了解不断变化的网络威胁是企业中每个人的责任。企业、政府机构、医疗机构、金融机构以及其他组织和行业都面临着日益复杂和频繁的网络安全威胁。为了有效应对这些威胁&…