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

文章目录

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

一、问题描述

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

【Leetcode 每日一题 - 补卡】3259. 超级饮料的最大强化能量

问题背景 来自未来的体育科学家给你两个整数数组 e n e r g y D r i n k A energyDrinkA energyDrinkA 和 e n e r g y D r i n k B energyDrinkB energyDrinkB&#xff0c;数组长度都等于 n n n。这两个数组分别代表 A A A、 B B B 两种不同能量饮料每小时所能提供的强化…

SOC(网络安全管理平台)

SOC平台&#xff0c;网络安全管理平台。 提供集中、统一、可视化的安全信息管理&#xff0c;通过实时采集各种安全信息&#xff0c;动态进行安全信息关联分析与风险评估&#xff0c;实现安全事件的快速跟踪、定位和应急响应。 从监控、审计、风险和运维四个维度建立起来的一套…

自动化电气行业的优势和劣势是什么

优势 市场需求广泛&#xff1a; 自动化电气技术广泛应用于电力系统、制造业、交通、农业等多个领域&#xff0c;随着智能化、数字化趋势的加强&#xff0c;其市场需求持续增长。在智能制造、智能电网等领域&#xff0c;自动化电气技术更是发挥着关键作用&#xff0c;推动了行业…

3.10 内核 BUG_ON() at xfs_vm_writepage() -> page_buffers()

目录 前言 问题分析 page buffers创建 page buffers丢失 Write-Protect Dirty Page w/o Buffers 问题解决 前言 这个问题发生在3.10.0-514.el7上&#xff0c;并且在RHEL的知识库中快速找到了对应的案例以及解决方案&#xff0c;但是&#xff0c;理解问题如何发生和解决…

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

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

vue中watch监听对象的某个属性

vue中watch监听对象的某个属性 第一种 &#xff1a; watch:{user.name(val){console.log(val)} }第二种&#xff08;不建议使用&#xff0c;对象有多个属性会一层一层遍历&#xff09;&#xff1a; watch:{user:{handle:function(newVal){console.log(newVal)},deep:true,//…

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

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;在博客文章下…

go 和java 编写方式的理解

1. go 推荐写流水账式的代码&#xff08;非贬义&#xff09;&#xff0c;自己管自己。java喜欢封装各种接口供外部调用&#xff0c;让别人来管自己。 2. 因为协程的存在&#xff0c; go的变量作用域聚集在方法内部&#xff0c;即函数不可重入&#xff0c;而java线程的限制&…

redis中的bigkey及读取优化

一、bigKey介绍 1、简介 在 Redis 中,Big Key(大键)指的是占用大量内存的单个键。通常,Redis 是一个高性能的内存数据库,但是当某些键变得非常大时,会带来性能上的影响。例如,大量的内存消耗、长时间的操作延迟,甚至可能导致 Redis 停止响应或崩溃。 通俗的来说,指…

NeurIPS 2024 有效投稿达 15,671 篇,数据集版块内容丰富

NeurIPS&#xff0c;全称 Neural Information Processing Systems Conference&#xff0c;是神经信息处理系统的年度学术会议。该会议始于 1987 年&#xff0c;当时名为 NIPS。随着人工智能领域的快速发展&#xff0c;其影响力逐渐扩大&#xff0c;被越来越多的研究者和企业关注…

服务器作业4

[rootlocalhost ~]# vim 11.sh #关闭防火墙 systemctl stop firewalld setenforce 0 #1.接收用户部署的服务名称 read -p "服务名称:(nginx)" server_name if [ $server_name ! nginx ];then echo "输入的不是nginx,脚本退出" exit 1 fi # 判断…

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

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

APP聊天项目介绍

项目结构说明 res/layout目录&#xff1a;存放布局相关的 XML 文件&#xff0c;用于定义界面的外观&#xff0c;包含activity_main.xml&#xff08;主界面布局&#xff09;和message_item.xml&#xff08;聊天消息项布局&#xff09;。 res/drawable目录&#xff1a;存放一些…