day54 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含手续费

题目1:309 买卖股票的最佳时机含冷冻期

题目链接:309 买卖股票的最佳时机含冷冻期

题意

整数数组prices中prices[i]表示第i天的股票价格,可以进行多次交易,但是在卖出股票后,无法在第二天买入股票(冷冻期为1天)算出最大利润

动态规划

动规五部曲

1)确定dp数组及下标i的含义

dp[i][j] 表示第i天持有/不持有股票时收获最大利润

dp[i][0] 表示第i天持有股票时收获最大利润

把不持有股票的状态分成两块

dp[i][1] 表示第i天保持卖出股票时收获最大利润

dp[i][2] 表示具体卖出股票时收获最大利润

dp[i][3] 表示第i天处于冷冻期

2)dp数组初始化

dp[0][0] = -prices[0]   第0天持有股票的状态

dp[0][1] = 0  第0天保持卖出股票的状态无意义,所以根据递推公式

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

dp[1][0] = dp[0][1]-prices[1]    第1天持有股票就是在第一天买入股票,dp[1][0]应该为-prices[1]

所以dp[0][1] 应该为 0

dp[0][2] = 0     第0天具体卖出股票 当天买当天卖,此时现金数为0

dp[0][3] = 0      第0天处于冷冻期无意义,所以根据递推公式

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

dp[1][0] = dp[0][3]-prices[1]    第1天持有股票  dp[1][0]为-prices[1],那么dp[0][3]应该为0

3)递推公式

第i天持有股票的状态  dp[i][0]

1)一直都持有股票  延续前一天持有股票的状态  ,  

2)之前可能会保持不持有股票(买入再卖出收获一定的本金)然后再买入 ,

3)冷冻期当天不可以持有股票,但是冷冻期之后的一天可以持有股票,

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

第i天保持卖出股票的状态  dp[i][1]

1)一直都保持卖出股票   保持前一天卖出股票的状态 

2)前一天是冷冻期 处于冷冻期的下一天

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

第i天具体卖出股票的状态   dp[i][2]   

前一天持有股票,在今天卖出

dp[i][2] = dp[i-1][0] + prices[i]

第i天处于冷冻期   

冷冻期的前一天一定是具体卖出股票的状态

dp[i][3] = dp[i-1][2]

4)遍历顺序

根据递推公式,当天状态取决于前一天的状态 从前向后遍历

5)打印dp数组

代码

class Solution {
public:int maxProfit(vector<int>& prices) {//定义数组vector<vector<int>> dp(prices.size(), vector<int>(4, 0));//dp数组初始化//持有股票的状态dp[0][0] = -prices[0];//保持卖出股票的状态dp[0][1] = 0;//具体卖出股票dp[0][2] = 0;//冷冻期dp[0][3] = 0;for(int i = 1; i <prices.size(); i++){//持有股票状态  一直持有股票  保持卖出股票的前一天   前一天是冷冻期dp[i][0] = max(dp[i-1][0], max(dp[i-1][1]-prices[i], dp[i-1][3]-prices[i]));//保持卖出股票的状态    前一天持有股票当天卖出   前一天是冷冻期状态  dp[i][1] = max(dp[i-1][1], dp[i-1][3]);//具体卖出股票  前一天持有股票dp[i][2] = dp[i-1][0] + prices[i];//冷冻期  前一天具体卖出股票dp[i][3] = dp[i-1][2];}return max(max(dp[prices.size()-1][0], dp[prices.size()-1][1]), max(dp[prices.size()-1][2], dp[prices.size()-1][3]));}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

题目2:714 买卖股票的最佳时机含手续费

题目链接:714 买卖股票的最佳时机含手续费

题意

整数数组prices中的元素prices[i]表示第i天的股票价格,每次交易股票都需要手续费fee,可以进行多次交易,返回获得的最大利润

动态规划

动规五部曲

1)dp数组及下标i的含义

dp[i][0]  第i天持有股票的最大现金数

dp[i][1]  第i天不持有股票的最大现金数

2)dp数组初始化

第0天持有股票 dp[0][0] = -prices[0]

第0天不持有股票 dp[0][1] = 0

3)递推公式

dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i])

dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]-fee)

4)遍历顺序

根据递推公式 从前向后遍历

5)打印dp数组

代码

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {//定义dp数组vector<vector<int>> dp(prices.size(), vector<int>(2,0));//初始化dp数组//第0天持有股票dp[0][0] = -prices[0];//遍历顺序for(int i=1;i<prices.size();i++){dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i]);dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]-fee);}return dp[prices.size()-1][1];}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

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

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

相关文章

设计模式(017)行为型之责任链模式

责任链模式&#xff0c;它允许你将请求沿着处理者链传递&#xff0c;直到有一个处理者能够处理该请求为止。在责任链模式中&#xff0c;有三个核心角色&#xff1a;请求者&#xff08;Client&#xff09;、处理者&#xff08;Handler&#xff09;、以及具体处理者&#xff08;C…

RuoYi-Vue若依框架-vue前端给对象添加字段

处理两个字段的时候有需求都要显示在下拉框的同一行&#xff0c;这里有两种解决方案&#xff0c;一是后端在实体类添加一个对象&#xff0c;加注解数据库忽略处理&#xff0c;在接口处拼接并传给前端&#xff0c;二是在前端获取的数据数组内为每个对象都添加一个字段&#xff0…

cannal的使用

搭建MySQL 安装canal 1.新建文件夹logs, 新建文件canal.properties instance.properties docker.compose.yml instance.properties ################################################# ## mysql serverId , v1.0.26 will autoGen # canal.instance.mysql.slaveId0# enable g…

06 Php学习:字符串

PHP 中的字符串变量 在 PHP 中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于存储文本数据。字符串变量可以包含字母、数字、符号等字符&#xff0c;并且可以进行各种操作和处理。以下是关于 PHP 中字符串变量的一些重要信息&#xff1a; 定义字符串变量&#xff1…

【SpringBoot3】Bean管理

1.Bean扫描 1.1传统Spring 标签&#xff1a;<context:component-scan base-package"com. example "/>注解&#xff1a;ComponentScan(basePackages "com.example") 1.2SpringBoot SpringBoot默认扫描启动类所在的包及其子包 2.Bean注册 如果要注…

Linux从入门到精通 --- 1.初始Linux

文章目录 第一章&#xff1a;1.1 Linux的诞生1.2 Linux系统内核1.3 Linux系统发行版 第一章&#xff1a; 1.1 Linux的诞生 1991年由林纳斯 托瓦兹创立并发展至今称为服务器操作系统领域的核心系统。 1.2 Linux系统内核 Linux内核提供了系统的主要功能&#xff0c;甚至是开源…

最大公约数算法详解

一、引言 最大公约数&#xff08;Greatest Common Divisor&#xff0c;GCD&#xff09;是数学中一个非常重要的概念。在计算机科学中&#xff0c;求解最大公约数不仅是数学问题的实际应用&#xff0c;也是算法设计的基本技能之一。本文将详细介绍几种常见的求解最大公约数的算…

【JS】判断双层数组中每一项是否都不为空

需求 判断双层数组中每一项是否都不为空&#xff0c;都不为空返回true&#xff0c;否则返回false 数组格式&#xff1a; arr1 [{list: [12, 25, 7, 18, 55]},{list: [36, 9]} ] arr2 [{list: [12, , 7, , 55]},{list: [36, 9]} ]实现 export function checkEmpty(arr) {le…

坚持十天做完Python入门编程100题第三天

坚持十天做完Python入门编程100题第三天 第15题 依次输出列表的元素和下标第16题 编写加速度函数第17题 编写函数计算球的体积第18题 函数默认值参数第19题 全局变量第20题 局部变量第21题 字符串格式化第22题 字符串格式化&#xff08;二&#xff09;第23题 字符串分隔 第15题…

SQL注入sqli_labs靶场第五、六题

第五题 根据报错信息&#xff0c;判断为单引号注入 没有发现回显点 方法&#xff1a;布尔盲注&#xff08;太耗时&#xff0c;不推荐使用&#xff09; 1&#xff09;猜解数据库名字&#xff1a;&#xff08;所有ASCII码值范围&#xff1a;0~127&#xff09; ?id1 and length…

TDengine too many open files

too many open files 是比较常见的报错&#xff0c;尤其使用TDengine 3.0 集群时&#xff0c;大概率会遇到。这个报错很简单&#xff0c;但要想顺利解决&#xff0c;却涉及到很多知识点。 目录 知识点&#xff1a;fs.nr_open知识点&#xff1a;file-max & fs.file-nr知识点…

stl set 的 insert()

set 跟 map 容器很像&#xff0c;但它俩又有很大的不同&#xff0c;它们的底层实现都是树&#xff0c;元素都是有序的&#xff0c;但map是可以修改元素的&#xff0c;而 set 就不行了&#xff0c;set 里的元素只有删除的情况&#xff0c;没有修改的情况&#xff1b;所以发现没有…

客户关系处理成功秘籍

目录 绪论: 第一章:客户关系管理概述 1.1 客户关系管理简介 1.2 客户关系管理的重要性 1.3 CRM的目标和原则 1.4 本章小结 第二章:建立客户数据库 2.1 客户数据库的重要性 2.2 建立客户数据库的步骤 2.3 数据库管理系统(DBMS) 2.4 数据分析工具 2.5 数据库安全…

数据治理(二)-基线治理

本文只是大概讲&#xff0c;基线任务治理方法&#xff0c;分为从基线owner和节点owner角度讲述分为两个部分&#xff1a; 1.基线治理(从基线Owner角度) Owner离职/转岗。 基线配置不合理。 高频预警/破线治理。 应急不及时治理。 2.基线任务治理(从节点Onwer) 2.1模型治…

Linux多进程通信(4)——消息队列从入门到实战!

Linux多进程通信总结——进程间通信看这一篇足够啦&#xff01; 1.基本介绍 1&#xff09;消息队列的本质其实是一个内核提供的链表&#xff0c;内核基于这个链表&#xff0c;实现了一个数据结构&#xff0c;向消息队列中写数据&#xff0c;实际上是向这个数据结构中插入一个…

怎样系统地学习自动化测试?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 平时的测试工作其实细分一下&#xff0c;大概有三个领域…

rust zip异步压缩与解压

在使用actix-web框架的时候&#xff0c;如果使用zip解压任务将会占用一个工作线程&#xff0c;因为zip库是同步阻塞的&#xff0c;想用异步非阻塞需要用另一个库&#xff0c;下面列出同步解压&#xff0c;跟异步解压的两个方法实现&#xff0c;异步解压不会占用工作线程。注意&…

C++ 线程库(thread)与锁(mutex)

一.线程库(thread) 1.1 线程类的简单介绍 thread类文档介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#xff0c;这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了&#xff…

操作系统的基础知识:操作系统的特征:并发,共享,虚拟,异步

操作系统的特性&#xff1a; 1.并发 并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的&#xff0c;但微观上是交替注意&#xff1a;并行:指两个或多个事件在同一时刻同时发生。 操作系统的并发性指计算机系统中“同时”运行着多个程序&#xff0c;这…

graphicLayer.startDraw({开启连续绘制isContinued之后,无法获取连续标绘的坐标数据

摘要&#xff1a;graphicLayer.startDraw({开启连续绘制isContinued之后&#xff0c;无法获取连续标绘的坐标数据的解决方案 问题前景&#xff1a; graphicLayer.startDraw({开启连续绘制isContinued之后&#xff0c;.then()方法只走一次&#xff0c;无法获取连续标绘的所有坐…