【动态规划刷题 6】 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含手续费

news2024/11/29 6:32:57

买卖股票的最佳时机含冷冻期

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

给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:
输入: prices = [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

示例 2:
输入: prices = [1]
输出: 0

1.状态表示

对于这种的问题,我们的状态表⽰⼀般有两种形式:

  1. i. 从 [i, j] 位置出发,……;
  2. ii. 从起始位置出发,到达 [i, j] 位置,……;

这⾥我们选择⽐较常⽤的⽅式,以某个位置为结尾,结合题⽬要求,定义⼀个状态表⽰:
可以看出,以某个位置为结尾时,我们可以分析出三种状态:
买入 , 可交易(可以购买股票), 冷冻

所以我们定义一个二维数组:

  1. dp[i][0] 表⽰:第 i 天结束后,处于「买⼊」状态,此时的最⼤利润;
  2. dp[i][1] 表⽰:第 i 天结束后,处于「可交易」状态,此时的最⼤利润;
  3. dp[i][2] 表⽰:第 i 天结束后,处于「冷冻期」状态,此时的最⼤利润

2.状态转移方程

通过对三个状态间的转移方式,我们可以得出

在这里插入图片描述
状态转移方程式:

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][2])
dp[i][2] = dp[i - 1][0] + prices[i]

3. 初始化

三种状态都会⽤到前⼀个位置的值,因此需要初始化每⼀⾏的第⼀个位置:

  1. dp[0][0] :此时要想处于「买⼊」状态,必须把第⼀天的股票买了,因此dp[0][0] = -prices[0] ;
  2. dp[0][1] :啥也不⽤⼲即可,因此 dp[0][1] = 0 ;
  3. dp[0][2] :⼿上没有股票,买⼀下卖⼀下就处于冷冻期,此时收益为 0 ,因此 dp[0][2]= 0

4. 填表顺序
根据「状态表⽰」,我们要三个表⼀起填,每⼀个表「从左往右」。

5. 返回值
返回三种状态下的最大值

max(dp[0][n-1],max(dp[1][n-1],dp[2][n-1]))

代码:

int maxProfit(vector<int>& prices) {
        int n=prices.size();

        vector<vector<int>> dp(3,vector<int>(n));
        dp[0][0]=-prices[0];
        dp[1][0]=dp[2][0]=0;

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

在这里插入图片描述

买卖股票的最佳时机含手续费

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

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例 1:
输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:8
解释:能够达到的最大利润:
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8

示例 2:
输入:prices = [1,3,7,5,10,3], fee = 3
输出:6

1.状态表示

对于这种的问题,我们的状态表⽰⼀般有两种形式:

  1. i. 从 [i, j] 位置出发,……;
  2. ii. 从起始位置出发,到达 [i, j] 位置,……;

这⾥我们选择⽐较常⽤的⽅式,以某个位置为结尾,结合题⽬要求,定义⼀个状态表⽰:
第i天结束后,所处的状态。
可以看出,以某个位置为结尾时,我们可以分析出两种状态:
买入 , 可交易(可以购买股票)

由题可知,只有在进行一次完整的交易后,才会扣除手续费,所以我们选择在将股票卖出后扣除手续费。

所以我们定义一个二维数组:

  1. dp[i][0] 表⽰:第 i 天结束后,处于「买⼊」状态,此时的最⼤利润;
  2. dp[i][1] 表⽰:第 i 天结束后,处于「可交易」状态,此时的最⼤利润;

2.状态转移方程

通过对两个状态间的转移方式,我们可以得出

在这里插入图片描述

状态转移方程式:

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

3. 初始化

由于需要⽤到前⾯的状态,因此需要初始化第⼀个位置。
◦ 对于 dp[i][0] ,此时处于「买⼊」状态,因此 dp[i0[0]= -prices[0] ;
◦ 对于 dp[i][1] ,此时处于「没有股票」状态,啥也不⼲即可获得最⼤收益,因此 dp[i][1]= 0 。

4. 填表顺序
毫⽆疑问是「从左往右」,但是两个表需要⼀起填

5. 返回值
应该返回「卖出」状态下,最后⼀天的最⼤值收益: dp[n-1][1];

代码:

  int maxProfit(vector<int>& prices, int fee) {
        int n=prices.size();

        vector<vector<int>> dp(n,vector<int>(2));

        dp[0][0]=-prices[0];//第一天手上有票
        dp[0][1]=0;//第一天手上没票

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

        return dp[n-1][1];
    }

在这里插入图片描述

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

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

相关文章

【赠书活动|第四期《互联网广告系统:架构、算法与智能化》】

文章目录 内容简介作者简介读者对象大咖推荐抽奖方式 广告平台的建设和完善是一项长期工程。例如&#xff0c;谷歌早于2003年通过收购Applied Semantics开展Google AdSense 项目&#xff0c;而直到20年后的今天&#xff0c;谷歌展示广告平台仍在持续创新和提升。广告平台是负有…

2024软考系统架构设计师论文写作要点

一、写作注意事项 系统架构设计师的论文题目对于考生来说&#xff0c;是相对较难的题目。一方面&#xff0c;考生需要掌握论文题目中的系统架构设计的专业知识;另一方面&#xff0c;论文的撰写需要结合考生自身的项目经历。因此&#xff0c;如何将自己的项目经历和专业知识有机…

内网穿透:实现公网访问内网群晖NAS的方法

公网远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 公网远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 在群晖控制面板找到“终端机和SNMP”2. 建立一条连接公网数据隧道3. 获取公网访问内网群晖NAS的数据隧道入口 前言 群晖NAS作为应用较为广泛的小型数据存储中心&#…

RabbitMQ学习——发布订阅/fanout模式 topic模式 rabbitmq回调确认 延迟队列(死信)设计

目录 引出点对点(simple)Work queues 一对多发布订阅/fanout模式以登陆验证码为例pom文件导包application.yml文件rabbitmq的配置生产者生成验证码&#xff0c;发送给交换机消费者消费验证码 topic模式配置类增加配置生产者发送信息进行发送控制台查看 rabbitmq回调确认配置类验…

Shopee虾皮买家号注册时需要注意什么问题

虾皮是一家在线购物平台&#xff0c;如果您打算在虾皮上注册一个买家账号&#xff0c;以下是一些需要注意的问题&#xff1a; 账号安全&#xff1a;确保您选择一个安全的密码&#xff0c;并定期更改密码&#xff0c;以保护您的账号免受未经授权的访问。 个人信息&#xff1a;…

idea报“Could not autowire. No beans of ‘UserMapper‘ type found. ”错解决办法

原因和解决办法 1.原因 idea具有检测功能&#xff0c;接口不能直接创建bean的&#xff0c;需要用动态代理技术来解决。 2.解决办法 1.修改idea的配置 1.点击file,选择setting 2.搜索inspections,找到Spring 3.找到Spring子目录下的Springcore 4.在Springcore的子目录下…

uni-app使用vue语法进行开发注意事项

目录 uni-app 项目目录结构 生命周期 路由 路由跳转 页面栈 条件编译 文本渲染 样式渲染 条件渲染 遍历渲染 事件处理 事件修饰符 uni-app 项目目录结构 组件/标签 使用&#xff08;类似&#xff09;小程序 语法/结构 使用vue 具体项目目录如下&#xff1a; 生命…

三步免费接入 Claude 2.0,支持多账号轮询!

Claude 2.0 已经发布了一段时间&#xff0c;经过我的非暴力测试&#xff0c;比 ChatGPT 3.5 的能力是要强的&#xff0c;有更强大的上下文 100k&#xff0c;相当于 10 万字的上下文记忆,非常适合处理长文档和大的代码段&#xff0c;虽说有些方面略逊色 ChatGPT 4.0 &#xff0c…

日常工具 之 一些 / 方便好用 / 免费 / 在线 / 工具整理

日常工具 之 一些 / 方便好用 / 免费 / 在线 / 工具整理 目录 日常工具 之 一些 / 方便好用 / 免费 / 在线 / 工具整理 1、在线Json &#xff0c;可以在线进行json 格式验证&#xff0c;解析转义等操作 2、Gif动图分解&#xff0c;在线把 gif 图分解成一张张单图 3、在线P…

仓储10、20代电子标签接口文档

标签注册 仓储10代注册 右下角左下角组合按键触发注册 注册成功&#xff1a;右上角绿灯变红灯&#xff0c;并显示信号强度的数值 ​ 仓储20代注册 右下角左下角组合按键触发注册 注册成功&#xff1a;右上角绿灯变红灯&#xff0c;并显示信号强度的数值 ​ 查询电子标签信息…

dinput8.dll导致游戏打不开的解决方法,快速修复dinput8.dll文件

当你尝试启动某个游戏时&#xff0c;如果遇到dinput8.dll文件缺失或损坏的错误提示&#xff0c;可能会导致游戏无法正常运行。dinput8.dll是DirectInput API的一部分&#xff0c;它提供了游戏手柄、键盘和鼠标等输入设备的支持。本文将详细介绍dinput8.dll的作用、导致游戏无法…

核心板如何选择合适的封装?

▍引言 核心板如何选择合适的封装&#xff1f; 核心板是一种集成了CPU、内存、存储、网络等功能的微型计算机模块&#xff0c;可以作为嵌入式系统的核心部件&#xff0c;或者作为开发板的扩展模块。核心板的封装方式决定了它与底板或者开发板的连接方式&#xff0c;影响着核心…

PP-ChatOCR:基于文心大模型的通用图像关键信息抽取利器,开发提效50%!

在日常生活中&#xff0c;大家经常会遇到图像关键信息自动抽取的场景&#xff0c;比如身份证拍照上传自动识别、发票拍照上传自动报销等。 在这个领域&#xff0c;现有的AI技术方案已经能解决一部分需求&#xff0c;但是依然存在一些痛点&#xff0c;比如发票的种类样式极其繁多…

低代码、逻辑、规则、数据分析、协同工具集合,解决企业不同需求

大家好&#xff0c;我是为IT部门兄弟操碎了心的“软件部长”&#xff0c;随着企业IT建设的不断发展&#xff0c;软开企服也在经历了数十年的项目中积累了丰富的经验&#xff0c;为此开始了IT软件的研发之路&#xff0c;之后就一发不可收拾。。。才有了现在出现在市面上的JVS。 …

CVPR 2023 | Attention-Based Point Cloud Edge Sampling

注1:本文系“计算机视觉/三维重建论文速递”系列之一,致力于简洁清晰完整地介绍、解读计算机视觉,特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 CVPR, ICCV, ECCV, NeurIPS等)。本次介绍的论文是: CVPR 2023 | Attention-Based Point Cloud Edge Sampling CVPR 2023 | …

Vue2嵌入HTML页面空白、互相传参、延迟加载等问题解决方案

一、需求分析 最近做的一个用H5加原生开发的html项目&#xff0c;现需要集成到Vue2.0项目里面来。遇到的相关问题做个记录和总结&#xff0c;以便能帮到大家避免踩坑。 二、问题记录 1、页面空白问题 将html页面通过iframe的方式嵌入进来之后&#xff0c;发现页面是空白的&am…

Why Test?

Why Test&#xff1f; 可测试性&#xff08;testability&#xff09;是一种设计的属性&#xff0c;衡量了全面测试制造设计的正确性的难易程度。原始的设计和测试过程是分开的&#xff0c;只有在设计周期的结尾考虑测试。而DFT将测试和设计融合在一起。 来自foundary的device…

Java面向对象++

面向对象编程(高级部分) 类变量和类方法 类变量 类变量也叫静态变量/静态属性&#xff0c;是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。 定义语法: 访问修饰符static数据类型变量…

加速招标流程:校对软件优化文件处理效率

校对软件在优化招标流程中可以提高文件处理效率&#xff0c;从而加速整个招标过程。以下是校对软件如何实现这一目标的方式&#xff1a; 1.自动化化校对&#xff1a;校对软件可以自动进行拼写、语法和格式等基本校对&#xff0c;减少人工校对的时间和工作量。这样可以快速检查和…

高忆管理:股票高开能不能买入?风险有哪些?

股票高开往往意味着股票的涨势较好&#xff0c;但也或许是短线资金炒作。那么股票高开能不能买入&#xff1f;危险有哪些&#xff1f;高忆管理也为我们准备了相关内容&#xff0c;以供参阅。 股票高开能不能买入&#xff1f; 股票高开是指当日开盘价高于前一日收盘价的状况&am…