当前位置: 首页 > news >正文

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

文章目录

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

一、问题描述

我们要解决的是一个关于股票买卖的问题:给定一个股票价格数组 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)。

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

博客

相关文章:

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

文章目录 一、问题描述二、解决思路状态转移初始化最终结果 三、代码实现执行流程解析时间和空间复杂度 一、问题描述 我们要解决的是一个关于股票买卖的问题&#xff1a;给定一个股票价格数组 stocks&#xff0c;每一天的价格为数组中的一个元素。我们可以通过买入和卖出的操…...

docker-compose 升级

官方下载地址&#xff1a; https://github.com/docker/compose/releases 下载完放到kali root目录下 # mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose # chmod x /usr/local/bin/docker-compose # docker-compose --version...

node.js @ffmpeg-installer/ffmpeg 桌面推流

//安装npm install --save ffmpeg-installer/ffmpeg //stream.js // 引入所需模块 const ffmpeg require(ffmpeg-installer/ffmpeg); const { exec } require(child_process); // 设置 FFmpeg 路径 const ffmpegPath ffmpeg.path; const rtmpUrl "rtmp://localhost…...

电脑启动需要经历哪些过程?

传统BIOS启动流程 1. BIOS BIOS 启动&#xff0c;BIOS程序是烧进主板自带的ROM里的&#xff0c;所以无硬盘也可以启动。BIOS先进行自检&#xff0c;检查内存、显卡、磁盘等关键设备是否存在功能异常&#xff0c;会有蜂鸣器汇报错误&#xff0c;无错误自检飞快结束。 硬件自检…...

MobaXterm Sessions 批量录入导入,会话批量添加

此脚本用于将服务器批量录入到 MobaXterm 会话 使用方法&#xff1a; 1、将IP列定义在 sessions_ip_list 变量中&#xff08;ssh登录的IP&#xff09; 2、将登录用户定义在 sessions_user 变量中&#xff08;ssh登录的用户&#xff09; 3、将目录名称定义在 folder_name 变…...

ceph的用户管理和cephx认证

用户权限概述 用户格式 参考链接&#xff1a; 权限&#xff1a;https://docs.ceph.com/en/latest/rados/operations/user-management/#authorization-capabilities 用户&#xff1a;https://docs.ceph.com/en/reef/rados/operations/user-management/ ceph的用户格式TYPEID…...

【北京迅为】iTOP-4412全能版使用手册-第二十章 搭建和测试NFS服务器

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...

MicroSoft Project2007 安装教程

一、安装教程 访问地址 二、安装链接 通过网盘分享的文件&#xff1a;Project2007CD 链接: https://pan.baidu.com/s/1Y8VnhVPiKjcmAEh8cIR5sQ?pwdp2hk 提取码: p2hk --来自百度网盘超级会员v6的分享...

怎样提高自己的能量

能量转换的基本原则是让别人需要你&#xff0c;而不是你去求对方。别人需要你&#xff0c;你的能量就高&#xff0c;你去求别人你的能量就低。 怎样提高自己的能量&#xff1f; 第一&#xff0c;留意你的气场和格局。气场不是说你表现的多么霸道&#xff0c;而是你的信念、决心…...

ScreenshotToCode安装教程

网页截图生成代码&#xff0c;我测试的效果一般 快速安装教程如下 1&#xff0c;首先你得有OpenAI的账号 国内用这个代理就可以&#xff1a; https://www.closeai-asia.com/ 充值一块钱&#xff0c;在本项目中可以生成两次 2&#xff0c;下载程序 下载程序压缩包&#xff1…...

工程企业如何做好成本控制?该如何入手?

工程企业的成本控制是企业管理中的核心工作&#xff0c;其直接关系到项目的盈利能力和市场竞争力。以下从几个关键方向阐述如何入手做好成本控制&#xff1a; 一、明确成本控制目标 成本控制的目标不仅是减少支出&#xff0c;更重要的是保证项目质量和工期&#xff0c;避免因低…...

详解桥接模式

引言 在开发过程中&#xff0c;可能会遇到系统设计有多种维度变化的情况&#xff0c;比如我们想画一幅五彩斑斓的画&#xff0c;需要用到12个颜色&#xff0c;但是需要粗细不同的线条&#xff08;粗、中、细&#xff09;&#xff0c;如果用蜡笔&#xff0c;就需要粗中细三种蜡笔…...

田忌赛马五局三胜问题matlab代码

问题描述&#xff1a;在可以随机选择出场顺序的情况下&#xff0c;如果把比赛规则从三局两胜制改为五局三胜制&#xff0c;齐王胜出的概率是上升了还是下降了&#xff1f;五局三胜的赛制下&#xff0c;大家的马重新分为5个等级。前提条件仍然是齐王每种等级的马都优于田忌同等级…...

Springboot 修改post请求接口入参或重新赋值

前言 很久之前写过一篇就是自动填充接口参数的&#xff0c;利用的 HandlerMethodArgumentResolver 自定义注解 Springboot Controller接口默认自动填充 业务实体参数值_springboot设置入参默认值-CSDN博客 现在这一篇也差不多&#xff0c;达到的目的就是重新去给post请求的参数…...

jmeter学习(7)命令行控制

jmeter -n -t E:\IOT\test2.jmx -l E:\IOT\output\output.jtl -j E:\IOT\output\jmeter.log -e -o E:\IOT\output\report IOT下创建output 文件夹&#xff0c;jmx文件名避免中文&#xff0c;再次执行output.jtl不能有数据要删除...

李春葆《数据结构》-查找-课后习题代码题

一&#xff1a;设计一个折半查找算法&#xff0c;求查找到关键字为 k 的记录所需关键字的比较次数。假设 k 与 R[i].key 的比较得到 3 种情况&#xff0c;即 kR[i].key&#xff0c;k<R[i].key 或者 k>R[i].key&#xff0c;计为 1 次比较&#xff08;在教材中讨论关键字比…...

Spring Boot教程之十: 使用 Spring Boot 实现从数据库动态下拉列表

使用 Spring Boot 实现从数据库动态下拉列表 动态下拉列表&#xff08;或依赖下拉列表&#xff09;的概念令人兴奋&#xff0c;但编写起来却颇具挑战性。动态下拉列表意味着一个下拉列表中的值依赖于前一个下拉列表中选择的值。一个简单的例子是三个下拉框&#xff0c;分别显示…...

Facebook的开源项目解析:推动开发者社区的技术进步

Facebook&#xff0c;作为全球领先的社交平台之一&#xff0c;其在技术领域的创新不仅体现在产品功能的实现上&#xff0c;也积极推动开源社区的发展。开源项目已经成为Facebook技术战略的重要组成部分&#xff0c;通过开源&#xff0c;Facebook不仅加速了技术进步&#xff0c;…...

以 SpringBoot 为基石的夕阳红公寓信息化管理系统设计理念

2 开发环境与技术 本章节对开发夕阳红公寓管理系统需要搭建的开发环境&#xff0c;还有夕阳红公寓管理系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff0c;不仅仅是创造者感觉C…...

身份证OCR 识别 API 接口的发展前景

随着信息时代的到来&#xff0c;大量的身份证数据需要进行整理、存储和管理&#xff0c;OCR 识别技术可以将身份证信息转化为结构化的电子文本&#xff0c;方便后续的数据管理和分析&#xff0c;提高工作效率。 未来&#xff0c;随着人工智能和深度学习等技术的不断发展&#…...

使用vue3实现element-plus的主题切换特效

先看实现效果 实现过程 前提需要引入好 element-plus&#xff0c;并导入element的黑色主题CSS 示例&#xff0c;再 main.js 中引入 import ElementPlus from element-plus import element-plus/dist/index.css import element-plus/theme-chalk/dark/css-vars.css // 黑色主…...

深入了解决策树---机器学习中的经典算法

引言 决策树&#xff08;Decision Tree&#xff09;是一种重要的机器学习模型&#xff0c;以直观的分层决策方式和简单高效的特点成为分类和回归任务中广泛应用的工具。作为解释性和透明性强的算法&#xff0c;决策树不仅适用于小规模数据&#xff0c;也可作为复杂模型的基石&…...

深度优先算法(DFS)和广度优先算法(BFS)

一、深度优先算法 深度优先搜索属于图算法的一种&#xff0c;是一个针对图和树的遍历算法&#xff0c;英文缩写为DFS即Depth First Search。深度优先搜索是图论中的经典算法&#xff0c;利用深度优先搜索算法可以产生目标图的相应拓扑排序表&#xff0c;利用拓扑排序表可以方便…...

Linux进程信号

信号量 本质是一个计数器&#xff0c;用来表示系统资源中&#xff0c;资源数量多少的问题。 公共资源:能被多个进程同时访问的资源。 访问没有被保护的资源&#xff0c;可能会出现数据不一致问题。 让不同进程看到同一个资源的目的是想通信。 为了解决进程具有独立性无法 …...

东风破捉妖师横空出世

一.异动拉升实时监测 东风破就像是一个大盘监测平台&#xff0c;是现实版的捉妖师&#xff0c;一旦妖股横空出世&#xff0c;就会在东风破面前原形毕露。东风破AI算法逻辑是监测存在异动拉升的股票&#xff0c;实时分析上证&#xff0c;深证&#xff0c;创业和科创板的股票数据…...

初窥门径:React中的事件机制

React中的事件机制 什么是合成事件&#xff1f;使用合成事件的好处事件委托事件池 React事件执行顺序 什么是合成事件&#xff1f; 在React中&#xff0c;合成事件&#xff08;Synthetic Events&#xff09; 是一种跨浏览器的事件包装机制&#xff0c;旨在统一浏览器的事件处理…...

【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构

Android Studio 版本 Android Java MVP 模式 参考 模型层 model public class User {private String email;private String password;public User(String email, String password) {this.email = email;this.password = password;}public String getEmail() {return email;}…...

DroneCAN 最新开发进展,Andrew在Ardupilot开发者大会2024的演讲

本文是Andrew演讲的中文翻译&#xff0c;你可以直接观看视频了解演讲的全部内容&#xff0c;此演讲视频的中文版本已经发布在Ardupilot社区的Blog板块&#xff0c;你可以在 Arudpilot官网&#xff08;https://ardupilot.org) 获取该视频&#xff1a; 你也可以直接通过Bilibili链…...

从 App Search 到 Elasticsearch — 挖掘搜索的未来

作者&#xff1a;来自 Elastic Nick Chow App Search 将在 9.0 版本中停用&#xff0c;但 Elasticsearch 拥有你构建强大的 AI 搜索体验所需的一切。以下是你需要了解的内容。 生成式人工智能的最新进展正在改变用户行为&#xff0c;激励开发人员创造更具活力、更直观、更引人入…...

如何给GitHub的开源项目贡献PR

&#x1f3af;导读&#xff1a;本文详细介绍了如何向开源项目“代码随想录”贡献自己的题解。首先&#xff0c;需要Fork原项目的仓库至个人GitHub账户&#xff0c;然后解决克隆仓库时可能遇到的SSH密钥问题。接着&#xff0c;按照标准流程对本地仓库进行代码或文档的修改&#…...

架构-微服务-服务配置

文章目录 前言一、配置中心介绍1. 什么是配置中心2. 解决方案 二、Nacos Config入门三、Nacos Config深入1. 配置动态刷新2. 配置共享 四、nacos服务配置的核心概念 前言 服务配置--Nacos Config‌ 微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相对分散。在一个…...

鱼眼相机模型-MEI

参考文献&#xff1a; Single View Point Omnidirectional Camera Calibration from Planar Grids 1. 相机模型如下&#xff1a; // 相机坐标系下的点投影到畸变图像// 输入&#xff1a;相机坐标系点坐标cam 输出&#xff1a; 畸变图像素点坐标disPtvoid FisheyeCamAdapter::…...

设计模式——抽象工厂模式

定义与概念 抽象工厂模式是一种创建型设计模式。它提供了一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。简单来说&#xff0c;抽象工厂就像是一个工厂的抽象蓝图&#xff0c;这个蓝图定义了生产一组产品的方法&#xff0c;但具体怎么生产这些产…...

大语言模型(LLM)不平衡的内存使用问题;训练过程中 Transformer层1和Transformer层2的反向传播计算量差异

目录 大语言模型(LLM)不平衡的内存使用问题 一、不平衡的内存使用概述 二、不平衡的内存使用举例 嵌入层与Transformer层之间的内存差异: 不同Transformer层之间的内存差异: 输入数据对内存使用的影响: 三、不平衡的内存使用带来的问题 四、解决方案 大语言模型的…...

AI需求条目化全面升级!支持多格式需求,打破模板限制!

AI需求条目化全面升级&#xff01;支持多格式需求&#xff0c;打破模板限制&#xff01; 一、多格兼济 标准立成 1、功能揭秘 预览未来 平台需求板块的AI需求条目化功能迎来全面升级。它支持多种需求格式&#xff0c;不再受限于模板文件&#xff0c;能够一键自动快速且灵活地生…...

C#:时间与时间戳的转换

1、将 DateTime 转换为 Unix 时间戳&#xff08;秒&#xff09; public static long DateTimeToUnixTimestamp(DateTime dateTime) {// 定义UTC纪元时间DateTime epochStart new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);// 计算从UTC纪元时间到指定时间的总秒数Tim…...

输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。-多语言

目录 C 语言实现 Python 实现 Java 实现 Js 实现 Ts 实现 题目&#xff1a;输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 程序分析&#xff1a;利用while语句,条件为输入的字符不为\n。 C 语言实现 #include <stdio.h>int mai…...

贪心-区间问题——acwing

题目一&#xff1a;最大不相交区间数量 908. 最大不相交区间数量 - AcWing题库 分析 跟区间选点一样。区间选点&#xff1a;贪心——acwing-CSDN博客 代码 #include<bits/stdc.h> using namespace std;const int N 1e510;struct Range {int l, r;// 重载函数bool op…...

OpenCV相机标定与3D重建(8)相机标定函数calibrateCamera()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从校准图案的多个视图中找到相机的内参和外参参数. cv::calibrateCamera 是 OpenCV 中用于相机标定的一个非常重要的函数。它通过一系列已知的世…...

Maven 插件

为 Maven 插件配置环境变量通常涉及到设置 Java 环境变量以及 Maven 相关的环境变量。以下是一些基本步骤&#xff1a; 1. 设置 Java 环境变量 Maven 需要 Java 运行环境&#xff0c;因此您需要确保 Java 的环境变量已经正确设置。 - **JAVA_HOME**&#xff1a;指向您的 Java…...

【Java基础入门篇】一、变量、数据类型和运算符

Java基础入门篇 一、变量、数据类型和运算符 1.1 变量 计算机中的数据表示方式是&#xff1a;“二进制(0/1)”&#xff0c;但是同时也可以兼容其他进制&#xff0c;例如八进制、十进制、十六进制等。 Java变量的本质是&#xff1a;存储在固定空间的内容&#xff0c;变量名是…...

[论文阅读]Poisoning Retrieval Corpora by Injecting Adversarial Passages

Poisoning Retrieval Corpora by Injecting Adversarial Passages 通过注入对抗性文本对检索语料库进行中毒 http://arxiv.org/abs/2310.19156 EMNLP2023 文章的目标就是要让检索器检索的结果包含攻击者生成的对抗性文本&#xff0c;如果能够检索到&#xff0c;则认为攻击成…...

[Redis#10] scan | db_0 | redis_cli | RESP | C++-redis启动教程

目录 1. 渐进式遍历 1.2 常见指令 - scan 2. 数据库管理 3.redis 客户端 是否前面学习的这些 redis 命令&#xff0c;没有价值了呢&#xff1f; 4.RESP 自定义协议 为什么能编写出一个自定义的 Redis 客户端&#xff1f; RESP 协议 5.在 Ubuntu 下启用 C 操作 Redis …...

LCR 151.彩灯装饰记录III

题目 代码 class Solution { public List<List> levelOrder(TreeNode root) { if(root null){ return new ArrayList<>(); } Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();int sum 1;…...

vue实现滚动条滑动到底部分页调取后端接口加载数据

一、案例效果 二、前提条件 接口返回数据 三、案例代码 子组件 const $emit defineEmits([cloneItem, updateList]);const props defineProps({rightList: {type: Array,},chartTableData: {type: Array as () > ChartListType[],},deleteChartInfo: {type: Object,}…...

Vscode连接服务器

在VS Code中连接服务器的主要步骤如下‌&#xff1a;‌ 1.‌安装Remote-SSH插件‌&#xff1a;打开VS Code&#xff0c;进入插件市场搜索“Remote-SSH”并安装。安装完成后&#xff0c;VS Code的侧边栏会出现一个远程资源管理器的图标。 2.‌配置服务器信息‌&#xff1a;点击…...

工作中Linux 内核的链表算法的使用

在 Linux 内核中,链表是一个非常重要的数据结构,广泛用于各种场景,如任务调度、设备管理、进程管理等。Linux 内核提供了高效且灵活的链表实现,能够更好地管理系统中的数据和对象。我们将深入浅出地讲解 Linux 内核链表的实现原理、用法,并举例展示如何使用。 1. 链表基本…...

洛谷P1115

最大子段和 - 洛谷 最大子段和 题目描述 给出一个长度为 n的序列a&#xff0c;选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数&#xff0c;表示序列的长度n。 第二行有n个整数&#xff0c;第i个整数表示序列的第 i个数字 a_i。 输出格式 输出一行…...

USB Type-C一线通扩展屏:多场景应用,重塑高效办公与极致娱乐体验

在追求高效与便捷的时代&#xff0c;启明智显USB Type-C一线通扩展屏方案正以其独特的优势&#xff0c;成为众多职场人士、娱乐爱好者和游戏玩家的首选。这款扩展屏不仅具备卓越的性能和广泛的兼容性&#xff0c;更能在多个应用场景中发挥出其独特的价值。 USB2.0显卡&#xff…...

使用Native AOT发布C# dll 提供给C++调用

Native AOT&#xff0c;即提前本地编译&#xff08;Ahead-Of-Time Compilation&#xff09;&#xff0c;是一种将托管代码&#xff08;如 C#&#xff09;编译为本机可执行文件的技术&#xff0c;无需在运行时进行任何代码生成。 &#xff08;Native AOT 优缺点截图摘自张善友博…...