「动态规划」买卖股票的最佳时机含冷冻期

力扣原题链接,点击跳转。

给你一个整数数组prices,其中prices[i]表示第i天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票(即冷冻期为一天)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

分析一下在第i天所有可能的状态。我会用「」把状态和操作标记出来,方便阅读。如果手中有股票,我们处在「买入」状态,此时可以进行的操作有「卖出股票」和「持有股票」;如果手中没有股票,我们处在「卖出」状态,又细分为「冷冻期」和「可交易」状态,前者可以进行的操作只有「啥也不做」,后者可以进行的操作有「买入股票」、「买入后立刻卖出股票」和「啥也不做」。注意:要分清楚状态和操作。我们只有「买入股票」或者「卖出股票」的操作后,才会更新利润,其中「买入股票」操作会让利润减少(因为花了钱),「卖出股票」操作会让利润增多(因为卖股票会得到钱)。

我们用动态规划的思想来解决这个问题,首先确定状态表示:我们用dp[i][0]表示第i天结束后处于「买入」状态下,最高的利润;用dp[i][1]表示第i天结束后处于「冷冻期」状态下,最高的利润;用dp[i][2]表示第i天结束后处于「卖出」状态下,最高的利润。接下来推导状态转移方程:

考虑dp[i][0],即第i天结束后处于「买入」状态。那么,第i-1天结束后是什么状态呢?如果第i-1天结束后是「买入」状态,此时在第i天采取「持有股票」操作,第i天结束后仍然会处于「买入」状态,此时的利润是dp[i-1][0];如果第i-1天结束后是「冷冻期」状态,此时只能在第i天「啥也不做」,在第i天结束后只有可能是「可交易」状态,无法在第i天结束后处于「买入」状态;如果第i-1天结束后是「可交易」状态,只需要在第i天「买入股票」,就会在第i天结束后处于「买入」状态,此时的利润是dp[i-1][2]-prices[i]。由于要求在第i天之后的最高利润,所以dp[i][0]=max(dp[i-1][0],dp[i-1][2]-prices[i])。

考虑dp[i][1],即第i天结束后处于「冷冻期」状态。那么,第i-1天结束后是什么状态呢?如果第i-1天结束后是「买入」状态,只需要在第i天「卖出股票」,就会在第i天结束后处于「冷冻期」状态,此时的利润是dp[i-1][0]+prices[i];如果第i-1天结束后是「冷冻期」状态,那么第i天只能「啥也不做」,第i天结束后一定是「可交易」状态,不可能是「冷冻期」状态;如果第i-1天结束后是「可交易」状态,只需要在第i天「买入后立刻卖出股票」,就会在第i天结束后处于「冷冻期」状态,此时的利润是dp[i-1][2]。由于要求在第i天之后的最高利润,所以dp[i][1]=max(dp[i-1][0]+prices[i],dp[i-1][2])。

考虑dp[i][2],即第i天结束后处于「可交易」状态。那么,第i-1天结束后是什么状态呢?如果第i-1天结束后是「买入」状态,手中有股票,由于「可交易」状态手中没有股票,所以要在第i天「卖出股票」,可是如此一来,第i天结束后就会处于「冷冻期」状态,无法转换为「可交易」状态;如果第i-1天结束后是「冷冻期」状态,在第i天「啥也不做」之后,第i天结束后自然就解冻了,处于「可交易」状态,此时的利润是dp[i-1][1];如果第i-1天结束后是「可交易」状态,在第i天「啥也不做」之后,自然会在第i天结束后继续处于「可交易」状态,此时的利润是dp[i-1][2]。由于要求在第i天之后的最高利润,所以dp[i][2]=max(dp[i-1][1],dp[i-1][2])。

我们要初始化dp[0][0]、dp[0][1]和dp[0][2]。考虑dp[0][0],要在第0天结束后处于「买入」状态,只有在第0天「买入股票」,所以dp[0][0]=-prices[0];考虑dp[0][1],要在第0天结束后处于「冷冻期」状态,要在第0天「买入后立刻卖出股票」,所以dp[0][1]=0;考虑dp[0][2],要在第0天结束后处于「可交易」状态,只需要在第0天「啥也不做」,所以dp[0][2]=0。

填表时应同时填dp[i][0]、dp[i][1]和dp[i][2],并且按照i递增的顺序填表。假设数组prices有n个元素,最终应返回max(dp[n-1][0],dp[n-1][1],dp[n-1][2]),即为第n-1天结束后最高的利润。

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();// 创建dp表vector<vector<int>> dp(n, vector<int>(3));// 初始化dp[0][1]=dp[0][2]=0dp[0][0] = -prices[0];// 从左往右同时填表for (int i = 1; i < n; i++){dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i]);dp[i][1] = max(dp[i-1][0] + prices[i], dp[i-1][2]);dp[i][2] = max(dp[i-1][1], dp[i-1][2]);}return max(dp[n-1][0], max(dp[n-1][1], dp[n-1][2]));}
};

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

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

相关文章

Python 关于字符串格式化

在Python中&#xff0c;字符串格式化有以下几种方法&#xff1a; 1.可以使用字符串的str.center(width), str.ljust(width), 和 str.rjust(width)方法来实现字符串的居中、左对齐和右对齐操作。 居中对齐&#xff1a; text "Python" centered_text text.center(10…

华为S5700交换机版本升级步骤

在用一台华为交换机。由于需要做目的镜像接口&#xff0c;在配置过程中超过一个双向流量观察口就会报错。从官方文档查到可以升级版本解决。记录一下升级过程。 首先确定设备型号S5700-28C-EI&#xff0c;版本&#xff1a; s5700ei-v100r005c01spc100。一定仔细阅读官方文档。明…

[python][whl]python模块python_geohash的whl文件所有版本下载地址汇总

Python使用Geohash实现 作为一名经验丰富的开发者&#xff0c;你将要教授一位刚入行的小白如何使用Python实现Geohash。Geohash是一种地理编码系统&#xff0c;将地球分成若干个矩形区域&#xff0c;并为每个矩形区域分配一个唯一的字符串编码。下面是实现这一任务的详细步骤&a…

springboot基本使用十一(自定义全局异常处理器)

例如&#xff1a;我们都知道在java中被除数不能为0&#xff0c;为0就会报by zero错误 RestController public class TestController {GetMapping("/ex")public Integer ex(){int a 10 / 0;return a;}} 打印结果&#xff1a; 如何将这个异常进行处理&#xff1f; 创…

rust 引用本地库

project | env /| component / # 库| src /| led.rslib.rs # 不能是 mod.rs&#xff0c;内容为 pub mod led;Cargo.toml... | abc /| abc / # 工程| src /| main.rsCargo.toml...库和普通工程是一样的&#xff0c;区别在于工程需要引用库 库的 Cargo.toml&#xff1a; [packa…

寺庙小程序-H5网页开发

大家好&#xff0c;我是程序员小孟。 现在有很多的产品或者工具都开始信息话了&#xff0c;寺庙或者佛教也需要小程序吗&#xff1f; 当然了&#xff01; 前面我们还开发了很多寺庙相关的小程序。 今天要介绍的是一款寺庙系统&#xff0c;该系统可以作为小程序、H5网页、安…

springboot实现文件上传功能,整合云服务

文章目录 这是springboot案例的,文件上传功能的拆分,本篇将带大家彻底了解文件上传功能,先从本地存储再到云存储,全网最详细版本,保证可以学会,可以了解文件上传功能的开发文件上传功能剖析进行书写一个小的文件上传文件上传的文件三要素首先表单提交的方式要是 post方式,第二个…

Leetcode 剑指 Offer II 080.组合

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个…

vue2+antv/x6实现er图

效果图 安装依赖 npm install antv/x6 --save 我目前的项目安装的版本是antv/x6 2.18.1 人狠话不多&#xff0c;直接上代码 <template><div class"er-graph-container"><!-- 画布容器 --><div ref"graphContainerRef" id"gr…

houdini编程语言:深入探索其复杂性与独特性

houdini编程语言&#xff1a;深入探索其复杂性与独特性 Houdini编程语言&#xff0c;作为一个富有创意和挑战性的领域&#xff0c;吸引了无数编程爱好者的目光。其独特的设计理念和复杂的语法结构&#xff0c;使得它成为了一个极具困惑度和爆发度的编程语言。本文将从四个方面…

国际荐酒师(香港)协会受邀出席广州意大利国庆晚宴

2024年5月30日&#xff0c;意大利驻广州总领事馆举办的2024年意大利国庆招待会及晚宴&#xff0c;庆祝意大利共和国成立。此次晚宴旨在促进中意两国之间的文化交流与合作。国际荐酒师&#xff08;香港&#xff09;协会受主办方邀请参与了这一重要活动。 国际荐酒师&#xff08;…

内核调度客制化利器:SCHED_EXT

一、前言 今年年初&#xff0c;宋宝华老师发表了一篇对2023年内核技术总结的文章《熠熠生辉 | 2023 年 Linux 内核十大技术革新功能》。有兴趣的伙伴可以点击蓝色字体链接回顾。 文章提及的10个技术中&#xff0c;与CPU任务调度器核心相关的内容&#xff0c;一共有两个&#xf…

Spring IoC 的实现机制

案例一&#xff1a; Spring 中的 IoC 的实现原理就是工厂模式加反射机制。我们先使用一个简单的案例理解一下&#xff1a; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException;// 定义一个水果接口&#xff0c;包含吃的方法 public i…

Vue 3.4.5深度解析:从基础到高级,掌握Composition API与全局API精髓

一、基础函数&特性 1. setup() 函数 作用&#xff1a;setup() 是Vue 3引入的一个新的组件选项&#xff0c;用于定义组件的逻辑。它在组件初始化阶段被调用&#xff0c;替代了Vue 2中的data、methods等选项。特点&#xff1a; 接收props和context作为参数。返回的对象将被…

Spring:jackson-annotaions注解大全

文章目录 一、介绍二、JsonProperty三、JsonIgnore四、JsonInclude五、JsonFormat六、JsonCreator 和 JsonProperty (在构造函数中)七、JsonTypeName 和 JsonTypeInfo八、JsonIgnoreProperties九、JsonSerialize十、JsonDeserialize 一、介绍 jackson-annotations 是 Jackson …

痛心!2岁女童被从17楼推下坠亡,凶手疑是未成年

一起又一起的案件&#xff0c; 如同一部沉重的史诗&#xff0c; 无声地述说着一个共同的真理&#xff1a; 严惩恶魔&#xff0c;实则是在庇护着无数纯真的心灵&#xff0c;守护着更多的孩子。 因为每一起案件的背后&#xff0c;都隐藏着一个个令人心碎的故事。 01 近日&#xf…

错误发生在尝试创建一个基于有限元方法的功能空间时

问题&#xff1a; index cell.index(#直接使用从0开始的索引if0<1ndex<10: #正集流体 subdomains_x[cell,index(] 1 fem1 /usr/bin/python3.8 /home/wy/PycharmProjects/pythonProject2/fem1.pyUnknown ufl object type FiniteElementTraceback (aost recent call last)…

python编程:实现对数据库中图片文件的查看及比对

当谈到图像查看和管理时,我们往往会使用一些工具软件,比如Windows自带的照片查看器或者第三方工具。那如果你想要一个更加强大和定制化的图像查看器呢?这时候就需要自己动手写一个程序了。 C:\pythoncode\new\ShowSqliteImage.py 这里我们将介绍一个使用Python和wxPython编写…

解析Java中1000个常用类:Iterable类,你学会了吗?

在 Java 编程中,集合(Collections)是非常重要的数据结构。无论是数组、列表、集合,还是其他形式的集合,如何高效地遍历这些集合都是一个关键问题。 Java 提供了一个基础接口 Iterable,它为集合类的遍历提供了统一的接口。 本文将深入探讨 Iterable 接口,介绍其用法、实…

FPGA-ARM架构与分类

ARM架构&#xff0c;曾称进阶精简指令集机器&#xff08;Advanced RISC Machine&#xff09;更早称作Acorn RISC Machine&#xff0c;是一个32位精简指令集&#xff08;RISC&#xff09;处理器架构。 主要是根据FPGA zynq-7000的芯片编写的知识思维导图总结,废话不多说自取吧 …