【动态规划】股票市场交易策略优化

文章目录

      • 一、问题描述
      • 二、解决思路
        • 状态转移
        • 初始化
        • 最终结果
      • 三、代码实现
      • 执行流程解析
      • 时间和空间复杂度

一、问题描述

我们要解决的是一个关于股票买卖的问题:给定一个股票价格数组 stocks,每一天的价格为数组中的一个元素。我们可以通过买入和卖出的操作来获取收益,但需要遵守以下规则:

  1. 每次买入前,必须先卖出之前的股票(即不能同时持有两次未卖出的股票)。
  2. 卖出股票后有一个冷冻期,也就是说,在卖出后的第二天才能继续买入股票。

我们的目标是:计算出在满足上述规则的情况下,最大可以获得的利润

例如,给定数组 [1, 2, 3, 0, 2]

  • 第一天买入,花费 -1
  • 第二天卖出,收入 +2
  • 第四天再次买入,花费 -0
  • 第五天卖出,收入 +2。 总收益为 3

二、解决思路

这是一个经典的 动态规划 问题。我们通过记录每一天的三种可能状态来逐步计算:

  1. 持有股票(hold):表示当天我们手中有股票的情况下,最大可能的收益。
  2. 未持有股票但不在冷冻期(unhold):表示当天我们手中没有股票,并且可以自由操作的情况下,最大可能的收益。
  3. 未持有股票且处于冷冻期(cooldown):表示当天我们手中没有股票,但因为刚卖出,处于冷冻期的情况下,最大可能的收益。
状态转移
  • 持有股票(hold

    • 要么昨天已经持有股票,今天保持不动(收益不变)。
    • 要么昨天没有股票(并且不在冷冻期),今天买入股票(收益减去今天的价格)。
    • 状态转移公式:在这里插入图片描述
  • 未持有股票但不在冷冻期(unhold

    • 要么昨天已经没有股票且不在冷冻期,今天也不操作(收益不变)。
    • 要么昨天刚结束冷冻期,今天自由操作(收益等于昨天冷冻期的收益)。
    • 状态转移公式:在这里插入图片描述
  • 未持有股票且处于冷冻期(cooldown

    • 必须是昨天持有股票,今天卖出进入冷冻期(收益增加今天的价格)。
    • 状态转移公式: 在这里插入图片描述
初始化
  • 第一天持有股票hold[0] = -stocks[0](买入股票后收益为负)。
  • 第一天未持有股票且不在冷冻期unhold[0] = 0(什么都不做,收益为 0)。
  • 第一天未持有股票且处于冷冻期cooldown[0] = 0(第一天不可能处于冷冻期)。
最终结果

最后一天的最大利润一定是:在这里插入图片描述

因为只有未持有股票时,收益才可能是最大值。


三、代码实现

public class Main {public static int solution(int[] stocks) {if (stocks == null || stocks.length == 0) {return 0; // 没有数据时,最大收益为 0}// 初始化第 1 天的三种状态int hold = -stocks[0];      // 第一天买入股票,收益为负的价格int unhold = 0;            // 第一天不持有股票,收益为 0int cooldown = 0;          // 第一天冷冻期不可能发生,收益为 0// 从第 2 天开始计算for (int i = 1; i < stocks.length; i++) {// 暂存之前的状态值,用于计算int prevHold = hold;int prevUnhold = unhold;int prevCooldown = cooldown;// 更新持有股票状态hold = Math.max(prevHold, prevUnhold - stocks[i]);// 更新未持有股票且不在冷冻期状态unhold = Math.max(prevUnhold, prevCooldown);// 更新未持有股票且处于冷冻期状态cooldown = prevHold + stocks[i];}// 最终结果是未持有股票的两种状态的最大值return Math.max(unhold, cooldown);}public static void main(String[] args) {// 测试用例System.out.println(solution(new int[]{1, 2})); // 输出 1System.out.println(solution(new int[]{2, 1})); // 输出 0System.out.println(solution(new int[]{1, 2, 3, 0, 2})); // 输出 3System.out.println(solution(new int[]{2, 3, 4, 5, 6, 7})); // 输出 5System.out.println(solution(new int[]{1, 6, 2, 7, 13, 2, 8})); // 输出 12}
}

执行流程解析

以输入数组 [1, 2, 3, 0, 2] 为例,逐步计算各状态:

天数持有股票(hold)未持有股票且无冷冻期(unhold)未持有股票且冷冻期(cooldown)
1-100
2-101
3-112
412-1
5123

最终结果为:max(unhold[4], cooldown[4]) = 3


时间和空间复杂度

  1. 时间复杂度:每一天的计算是常数操作,时间复杂度为 O(n),其中 n 是数组的长度。
  2. 空间复杂度:只用到了常数个变量,空间复杂度为 O(1)。

我们通过动态规划,把问题分解为三个状态,分别计算每天的最佳选择。

博客

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

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

相关文章

SVL-Adapter: Self-Supervised Adapter for Vision-Language Pretrained Models

当前的问题 CLIP和CLIP-Adapter等方法的一个主要局限性是&#xff0c;它们没有对视觉编码器所编码的底层表示进行显著的修改。原因很简单&#xff1a;微调大型模型需要大量的监督&#xff0c;这在低监督学习设置中是很难获得的。如果下游分类任务的图像来自与互联网常见图像相…

Rust SQLx CLI 同步迁移数据库

上文我们介绍了SQLx及SQLite&#xff0c;并介绍了如何使用代码同步迁移数据库。本文介绍Sqlx cli 命令行工具&#xff0c;介绍如何安装、使用&#xff0c;利用其提供的命令实现数据表同步迁移。Java生态中有flyway, sqlx cli 功能类似&#xff0c;利用命令行工具可以和其他语言…

丹摩|丹摩智算平台使用教学指南

本指南旨在为新用户提供一个详细的操作步骤和实用的入门指导&#xff0c;帮助大家快速上手丹摩智算平台。 一、平台简介 丹摩智算平台是一款强大的数据分析和计算平台&#xff0c;支持多种编程语言&#xff0c;提供丰富的数据处理和机器学习工具。无论您是数据分析师、开发者…

代码美学:MATLAB制作渐变色

输入颜色个数n&#xff0c;颜色类型&#xff1a; n 2; % 输入颜色个数 colors {[1, 0, 0], [0, 0, 1]}; createGradientHeatmap(n, colors); 调用函数&#xff1a; function createGradientHeatmap(n, colors)% 输入检查if length(colors) ~ nerror(输入的颜色数量与n不一…

【大数据学习 | Spark调优篇】常用的shuffle优化

shuffle是一个涉及到CPU&#xff08;序列化反序列化&#xff09;、网络IO&#xff08;跨节点数据传输&#xff09;以及磁盘IO&#xff08;shuffle中间结果落盘&#xff09;的操作。 优化思路&#xff1a; 减少shuffle的数据量&#xff0c;减少shuffle的次数。 具体方式&…

Spring中每次访问数据库都要创建SqlSession吗?

一、SqlSession是什么二、源码分析1&#xff09;mybatis获取Mapper流程2&#xff09;Spring创建Mapper接口的代理对象流程3&#xff09;MapperFactoryBean#getObject调用时机4&#xff09;SqlSessionTemplate创建流程5&#xff09;SqlSessionInterceptor拦截逻辑6&#xff09;开…

娱乐API:快速生成藏头诗、藏尾诗和藏中诗

引言 诗歌是中国传统文化的重要组成部分&#xff0c;其中藏头诗、藏尾诗和藏中诗因其独特的形式而备受喜爱。为了满足广大文学爱好者的需求&#xff0c;我们推出了一款娱乐API&#xff0c;支持快速生成藏头诗、藏尾诗和藏中诗。本文将详细介绍该API的功能、使用方法以及如何将…

以达梦为数据库底座时部署的微服务页面报乱码,调整兼容模式

1.问题描述 部署微服务&#xff0c;文件、代码是延用的mysql类型的&#xff0c;部署前做了部分适配&#xff0c;但是在使用dm数据库进行安装的服务在页面上查询出的数据却都是乱码 2.查询官网&#xff0c;注意到一个参数COMPATIBLE_MODE兼容模式的配置 考虑是延用mysql&…

个人博客接入github issue风格的评论,utteranc,gitment

在做个人博客的时候&#xff0c;如果你需要评论功能&#xff0c;但是又不想构建用户体系和评论模块&#xff0c;那么可以直接使用github的issue提供的接口&#xff0c;对应的开源项目有utteranc和gitment&#xff0c;尤其是前者。 它们的原理是一样的&#xff1a;在博客文章下…

二,[ACTF2020 新生赛]Include1感谢 Y1ng 师傅供题。

进入靶场后&#xff0c;发现tips可以点击 点击后进入此页面 猜测此为文件包含漏洞,构造payload&#xff0c;并成功得到base64编码后的源码 详解payload&#xff1a; php://filter/readconvert.base64-encode/resourceflag.php 1.php://filter是PHP中的一个流封装协议&#xf…

vue3.0 根据富文本html页面生成压缩包(含视频在线地址、图片在线地址、前端截图、前端文档)

vue3.0生成压缩包&#xff08;含在线地址、前端截图、前端文档&#xff09; 需求描述效果开始下载插件包基本代码构造 点击下载按钮1.截图content元素&#xff0c;并转化为pdfcanvas putImageData、getImageDatagetImageData 获取指定矩形区域的像素信息putImageData 将这些数据…

单细胞细胞通讯全流程分析教程,代做分析和辅导

0. 分析参数文件和细胞通讯的演示数据 0.1 细胞通讯分析总的参数文件&#xff0c;后面部分细胞通讯分析模块会用到 分析参数文件 参数文件名称&#xff1a;total_analysis_params_demo.xlsx &#xff0c;很多分析模块都是这个总的参数文件&#xff0c;我的这个总的参数文件如…

C++趣味编程:基于树莓派Pico的模拟沙漏-倾斜开关与LED的互动实现

沙漏,作为一种古老的计时工具,利用重力让沙子通过狭小通道,形成了计时效果。在现代,我们可以通过电子元件模拟沙漏的工作原理。本项目利用树莓派Pico、倾斜开关和LED,实现了一个电子沙漏。以下是项目的详细技术解析与C++代码实现。 一、项目概述 1. 项目目标 通过倾斜开关…

RAG (Retrieval Augmented Generation) 检索增强和生成

1 RAG技术简介 1.1 RAG技术概述 RAG&#xff08;Retrieval Augmented Generation&#xff09; 是一种结合了检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的技术&#xff0c;旨在通过利用外部知识库来增强大型语言模型&#xff08;LLMs&am…

DIY-Tomcat part 3 实现对动态资源的请求

实现ServletRequest package connector;import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i…

黑马程序员Java笔记整理(day05)

1.面向对象编程 2.用法 3.对象是什么 4.对象在计算机中是啥 5.无参与有参构造器 小结: 6.this的作用 7.小结 8.封装 9.小结 10.实体类 11.小结 12.static 13.小结 14.static修饰方法 15.static应用前景 16.几个注意事项 17.java中可以直接用类的名字创建数组&#xff0c;如: M…

Perforce SAST专家详解:自动驾驶汽车的安全与技术挑战,Klocwork、Helix QAC等静态代码分析成必备合规性工具

自动驾驶汽车安全吗&#xff1f;现代汽车的软件包含1亿多行代码&#xff0c;支持许多不同的功能&#xff0c;如巡航控制、速度辅助和泊车摄像头。而且&#xff0c;这些嵌入式系统中的代码只会越来越复杂。 随着未来汽车的互联程度越来越高&#xff0c;这一趋势还将继续。汽车越…

《Python基础》之数据加密模块hashlib的用法

目录 一、简介 二、用法 步骤一、导入hashlib库 步骤二、创建哈希对象 步骤三、往哈希对象中传值 1、可以在创建对象的时候传值 2、使用updata传值 步骤四、获取经过哈希对象加密后的值 三、注意事项 1、编码问题 2、安全性 3、多次传值 四、总结 一、简介 hashli…

QT实战--qt各种按钮实现

本篇介绍qt一些按钮的实现&#xff0c;包括正常按钮&#xff1b;带有下拉箭头的按钮的各种实现&#xff1b;按钮和箭头两部分分别响应&#xff1b;图片和按钮大小一致&#xff1b;图片和按钮大小不一致的处理&#xff1b;文字和图片位置的按钮 效果图如下&#xff1a; 详细实现…

【OJ】前K个高频单词和单词识别和两个数组的交集

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 692. 前K个高频单词1.1 分析1.2 代码 2. KY264 单词识别2.1 分析2.2 代码 3. 349. 两个数组的交集3.1 分析3.2 代码 1. 692. 前K个高频单词 1.1 分析 先试用map来统计每个单词出现的次数&#xff1a; map<string,i…