【多状态dp】买卖股票的最佳时机III

注意1:本题所指的买入与卖出均为一种状态,准确来说是持有和不持有。并不代表当天一定是买入或者卖出,上述状态亦可从前一天的状态转化而来。

  1. dp[i][0]:第一次买入股票后的最大利润。
  2. dp[i][1]:第一次卖出股票后的最大利润。
  3. dp[i][2]:第二次买入股票后的最大利润。
  4. dp[i][3]:第二次卖出股票后的最大利润。

注意2:为什么要如此进行初始化?主要是对第二次交易的状态的理解。

dp[0][0] = -prices[0];  // 第一次买入,花费了 prices[0]
dp[0][1] = 0;           // 第一次卖出,但第一天不可能卖出,所以利润为0
dp[0][2] = -prices[0];  // 第二次买入,花费了 prices[0]
dp[0][3] = 0;           // 第二次卖出,但第一天不可能卖出,所以利润为0

如此初始化的目的是为了确保我们在动态规划的初始阶段有一个合理的起点。具体来说,我们假设在第一天可以进行两次买入操作—即一天中可以完成多次交易(虽然这是不现实的,但这是为了确保状态转移的正确性)。这样,我们可以在后续的动态规划过程中逐步更新状态,最终得到正确的最大利润。

注意3:为什么只要返回第二天卖出状态的最大利润即可?

在我们的状态定义中,我们假设一天可以进行多次交易。正因为如此,如果当前最大利润出现在第一次交易完成之后,我们第二次交易的完成也可以在同一天进行,即当天买入当天卖出,此时完成了第二次交易且所获利润为0。由此可见,第二天卖出状态的最大利润这个值已经考虑了所有可能的交易组合,并且确保了通过两次交易可以获得的最大利润。 

  1. dp[n-1][3] 表示在最后一天(即第n-1天)第二次卖出股票后的最大利润。
  2. 这个状态已经考虑了所有可能的交易组合,包括同一天买入和卖出。
  3. 换句话说,dp[n-1][3]包含了所有可能的交易策略,包括:
    • 第一次买入和第一次卖出。
    • 第二次买入和第二次卖出。
    • 允许同一天买入和卖出,即可以进行多次交易。

考虑同一天买入和卖出

  1. 同一天买入和卖出:如果我们在某一天买入股票并在同一天卖出,这种操作的利润为0。但在动态规划中,这种操作是被允许的,因为它不会影响我们的最大利润计算。
  2. 最大利润:通过允许同一天买入和卖出,我们可以更灵活地计算最大利润,因为我们不限制交易的时间点,只有在最后一天第二次卖出后的状态才是我们关心的。

完整代码:

class Solution {
public:int maxProfit(vector<int>& prices) {// 状态:// 第一次买入股票的状态// 第一次卖出股票的状态// 第二次买入股票的状态// 第二次卖出股票的状态int n = prices.size();vector<vector<int>> dp(n, vector<int>(4, 0));// 初始化// 【注意】:我们将当天买入和当天卖出也视为一次交易dp[0][0] = dp[0][2] = -prices[0];for(int i = 1; i < n; i++){// 1、第一次买入可能是延续前一天买入,也可能是当天买入dp[i][0] = max(dp[i - 1][0], -prices[i]);// 2、第一次卖出可能是延续前一天卖出,也可能是当天卖出dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);// 3、第二次买入可能是延续前一天买入,也可能是当天买入dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] - prices[i]);// 4、第二次买出可能是延续前一天卖出,也可能是当天卖出dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] + prices[i]);}return dp[n - 1][3]; // 或 return max(dp[n - 1][1], dp[n - 1][3]);}
};

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

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

相关文章

网页抓取API,让数据获取更简单

网页抓取的过程通常分为以下步骤&#xff0c;尤其是在面对静态网页时&#xff1a; 获取页面 HTML&#xff1a;使用 HTTP 客户端下载目标页面的 HTML 内容。解析 HTML&#xff1a;将下载的 HTML 输入解析器&#xff0c;准备提取内容。提取数据&#xff1a;利用解析器功能&#…

D3中颜色的表示方法大全

d3-color 是 D3.js 库中的一个模块&#xff0c;用于处理颜色。它提供了多种方式来表示和操作颜色。下面是一些常见的颜色表示方法及示例代码&#xff1a; 1. CSS颜色关键字 CSS 颜色关键字是一种简单的方式来指定颜色。例如&#xff1a; const color d3.color("steelbl…

IDEA2023 创建SpringBoot项目(一)

一、Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。 二、快速开发 1.打开IDEA选择 File->New->Project 2、…

下一代以区域为导向的电子/电气架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

详细解析STM32 GPIO引脚的8种模式

目录 一、输入浮空&#xff08;Floating Input&#xff09;&#xff1a;GPIO引脚不连接任何上拉或下拉电阻&#xff0c;处于高阻态 1.浮空输入的定义 2.浮空输入的特点 3.浮空输入的应用场景 4.浮空输入的缺点 5.典型配置方式 6.注意事项 二、输入上拉&#xff08;Inpu…

第8章 硬件维护-8.6 产品变更管理(PCN)

8.6 产品变更管理&#xff08;PCN&#xff09; PCN是Product Change Notice&#xff08;产品变更管理&#xff09;的缩写。PCN是厂商为了提高质量、降低成本主动向客户发起的产品变更。一般涉及如下变更的&#xff0c;需要发布PCN公告。 &#xff08;1&#xff09;生产地址变更…

关于安卓模拟器或手机设置了BurpSuite代理和安装证书后仍然抓取不到APP数据包的解决办法

免责申明 本文仅是用于学习研究安卓系统设置代理后抓取不到App数据包实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法时习之丨网络安全在身边一…

【小程序】dialog组件

这个比较简单 我就直接上代码了 只需要传入title即可&#xff0c; 内容部分设置slot 代码 dialog.ttml <view class"dialog-wrapper" hidden"{{!visible}}"><view class"mask" /><view class"dialog"><view …

问:Spring MVC DispatcherServlet流程步骤梳理

DispatcherServlet是Spring MVC框架中的核心组件&#xff0c;负责接收客户端请求并将其分发到相应的控制器进行处理。作为前端控制器&#xff08;Front Controller&#xff09;的实现&#xff0c;DispatcherServlet在整个请求处理流程中扮演着至关重要的角色。本文将探讨Dispat…

uni-app快速入门(十)--常用内置组件(下)

本文介绍uni-app的textarea多行文本框组件、web-view组件、image图片组件、switch开关组件、audio音频组件、video视频组件。 一、textarea多行文本框组件 textarea组件在HTML 中相信大家非常熟悉&#xff0c;组件的官方介绍见&#xff1a; textarea | uni-app官网uni-app,un…

一些任务调度的概念杂谈

任务调度 1.什么是调度任务 依赖&#xff1a;依赖管理是整个DAG调度的核心。调度依赖包括依赖策略和依赖区间。 依赖分为任务依赖和作业依赖&#xff0c;任务依赖是DAG任务本身的依赖关系&#xff0c;作业依赖是根据任务依赖每天的作业产生的。两者在数据存储模型上有所不同…

[已解决]Tomcat 9.0.97控制台乱码

maven3.8.1 JDK11 Tomcat9.0.97 修改apache-tomcat-9.0.97\conf\logging.properties文件&#xff1a; WebServlet("/login") public class LoginServlet extends HttpServlet {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) th…

语义通信论文略读(十六)多任务+中继通道

Two Birds with One Stone: Multi-Task Semantic Communications Systems over Relay Channel 一石二鸟&#xff1a;中继通道上的多任务语义通信系统 作者: Yujie Cao, Tong Wu, Zhiyong Chen, Yin Xu, Meixia Tao, Wenjun Zhang 所属机构: 上海交通大学 时间&#xff1a;…

【微软:多模态基础模型】(5)多模态大模型:通过LLM训练

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html&#xff09;原创作品 【微软&#xff1a;多模态基础模型】&#xff08;1&#xff09;从专家到通用助手 【微软&#xff1a;多模态基础模型】&#xff08;2&#xff09;视觉理解 【微…

蓝桥杯第22场小白入门赛2~5题

这场比赛开打第二题就理解错意思了&#xff0c;还以为只能用3个消除和5个消除其中一种呢&#xff0c;结果就是死活a不过去&#xff0c;第三题根本读不懂题意&#xff0c;这蓝桥杯的题面我只能说出的是一言难尽啊。。第四题写出来一点但是后来知道是错了&#xff0c;不会正解&am…

【初阶数据结构篇】队列的实现(赋源码)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

Java基础夯实——2.4 线程的生命周期

Java线程生命周期 Java线程的生命周期分为&#xff1a;新建&#xff08;New&#xff09;、就绪&#xff08;Runnable&#xff09;、阻塞&#xff08;Blocked&#xff09;、等待 (Waiting) 、计时等待&#xff08;Timed_Waiting&#xff09;、终止&#xff08;Terminated&#…

基于Java Springboot二手书籍交易系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

【Mac】未能完成该操作 Unable to locate a Java Runtime

重生之我做完产品经理之后回来学习Data Mining Mac打开weka.jar报错"未能完成该操作 Unable to locate a Java Runtime" 1. 打开终端执行 java -version 指令&#xff0c;原来是没安装 JDK 环境 yyzccnn-mac ~ % java -version The operation couldn’t be comple…

【大语言模型】ACL2024论文-12 大型语言模型的能力如何受到监督式微调数据组成影响

【大语言模型】ACL2024论文-12 大型语言模型的能力如何受到监督式微调数据组成影响 论文&#xff1a;https://arxiv.org/pdf/2310.05492 目录 文章目录 【大语言模型】ACL2024论文-12 大型语言模型的能力如何受到监督式微调数据组成影响论文&#xff1a;https://arxiv.org/p…