动态规划解股票类型

news2024/10/12 22:32:24

文章目录

  • 单只股票买卖
  • 多次买卖单只股票
  • 最多两次买卖股票
  • 最多买k次
  • 含冷静期
  • 含手续费

单只股票买卖

买卖股票的最佳时机
关键思路:找到一个值,他与之后的最大值之差最大。
用minprice记录最小的值,用maxprofit记录最大的收益。
想清楚一个点:

  • 更新最小值时,影响最大收益吗?
    • 不会影响,因为每个收益都是需要根据minprice后续的最大值
class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length<=1) return 0;
        int n = prices.length;
        int minprice = Integer.MAX_VALUE;
        int maxprofit = 0;
        for(int i = 0 ; i < n ;i++ ){
            minprice =Math.min(minprice, prices[i]);
            
            maxprofit = Math.max(prices[i] -minprice,maxprofit);
        }
        return maxprofit;
    }
}

多次买卖单只股票

买卖股票的最佳时机 II
profitBuy 用于记录已购买股票后的最大利润,而 profitNOBuy 用于记录未购买股票时的最大利润。在一个循环中,它逐步计算了每一天的最佳策略,然后返回最后一天的最大利润。

  • profitBuy[i] 表示在第 i 天持有股票时的最大利润,它等于在第 i-1 天继续持有股票或在第 i-1 天卖出股票后买入的最大值。
  • profitNOBuy[i] 表示在第 i 天没有持有股票时的最大利润,它等于在第 i-1 天继续观望不购买股票或在第 i-1 天购买股票后卖出的最大值。

在遍历结束后,函数返回两种情况的最大值,即最大利润。用动态规划的方法来解决买卖股票的问题,确保在每一天都选择最优的策略以获得最大的利润。

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        int profitBuy[] = new int[n]; // 用于记录已购买股票后的最大利润
        int profitNOBuy[] = new int[n]; // 用于记录未购买股票时的最大利润
        profitBuy[0] = -prices[0]; // 初始化第一天已购买的情况,初始资金为负的第一天股票价格
        profitNOBuy[0] = 0; // 初始化第一天未购买股票的情况,初始资金为0
        for (int i = 1; i < n; i++) {
            // 更新已购买股票后的最大利润,考虑继续持有或卖出的情况
            profitBuy[i] = Math.max(profitBuy[i - 1], profitNOBuy[i - 1] - prices[i]);
            // 更新未购买股票时的最大利润,考虑继续观望或购买的情况
            profitNOBuy[i] = Math.max(profitNOBuy[i - 1], profitBuy[i - 1] + prices[i]);
        }
        // 最终返回最后一天的两种情况的最大值,即最大利润
        return Math.max(profitBuy[n - 1], profitNOBuy[n - 1]);
    }
}

最多两次买卖股票

123. 买卖股票的最佳时机 III

  1. 首先,定义了四个变量:minpricemaxprofitminprice2,和maxprofit2,它们用来存储在遍历价格数组过程中的一些重要信息。
  2. 通过循环遍历价格数组 prices,其中 i 表示当前的天数。
  3. minprice 用来记录在第 i 天之前的最低股票价格。在循循环过程中,不断更新 minprice 为当前价格 prices[i]minprice 之间的较小值。
  4. maxprofit 用来记录在第 i 天卖出股票时的最大利润。利润计算为当前价格 prices[i] 减去之前的最低价格 minprice,并且与之前的最大利润 maxprofit 比较,取较大值。
  5. minprice2 用来记录在第 i 天之前的最低股票价格,考虑到第二次交易。这里 minprice2 考虑了第一次交易的收益 maxprofit,即 prices[i] - maxprofit,因为在第一次交易中,你已经卖出了一次股票,所以要减去第一次交易的利润。
  6. maxprofit2 用来记录在第 i 天卖出股票时的最大利润,考虑第二次交易。利润计算为当前价格 prices[i] 减去之前的最低价格 minprice2,并与之前的最大利润 maxprofit2 比较,取较大值。
  7. 最后,返回 Math.max(maxprofit2, maxprofit),因为你要最大化两次交易的总利润。

这个算法的关键在于动态地维护四个变量,以确保在每一天都考虑了两次交易的情况,并计算出最大利润。

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        if(n<=1) return 0;
        int minprice = Integer.MAX_VALUE;
        int maxprofit = 0;

        int minprice2 = Integer.MAX_VALUE;
        int maxprofit2 = 0;
        for(int i = 0 ; i < n ;i++ ){
            minprice = Math.min(minprice, prices[i]);

            minprice2 = Math.min(minprice2 , prices[i] - maxprofit);

            maxprofit = Math.max(prices[i] -minprice,maxprofit);

            maxprofit2 = Math.max(maxprofit2 , prices[i] - minprice2);
        }
        return Math.max(maxprofit2,maxprofit);
    }
}

最多买k次

188. 买卖股票的最佳时机 IV
把k想象成2即可,按照两次的思路

class Solution {
    public int maxProfit(int k, int[] prices) {
        int n = prices.length;
        if(n<=1) return 0;
        int minprice[] = new int[k];
        int maxprofit[] = new int[k];
        for(int i=0;i<k;i++){
             minprice[i] = Integer.MAX_VALUE;
             maxprofit[i] = 0;
        }

        for(int i = 0 ; i < n ;i++ ){
            minprice[0] = Math.min(minprice[0], prices[i]);
            maxprofit[0] = Math.max(prices[i] -minprice[0],maxprofit[0]);   
            for(int j=1;j<k;j++){
                minprice[j] = Math.min(minprice[j] , prices[i] - maxprofit[j-1]);  
                maxprofit[j] = Math.max(maxprofit[j] , prices[i] - minprice[j]);
            }
        }
        return maxprofit[k-1];
    }
}

含冷静期

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

状态转移图

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        if(n<=1) return 0;
        int dpNoBuy[] = new int[n];
        int dpBuy[] = new int[n];
        int dpCd[] = new int[n];
        dpNoBuy[0] = -prices[0];
        dpBuy[0] = 0;
        dpCd[0] = 0;
        for (int i = 1; i < n; i ++) {
              dpNoBuy[i] = Math.max(dpCd[i-1] - prices[i],dpNoBuy[i-1]);
              dpBuy[i] = Math.max(dpNoBuy[i-1] + prices[i],dpBuy[i-1]);
              dpCd[i] = Math.max(dpCd[i-1],dpBuy[i-1]);
        }

        return Math.max(Math.max(dpNoBuy[n-1],dpCd[n-1]),dpBuy[n-1]);
    }
}

含手续费

714. 买卖股票的最佳时机含手续费
两个状态转换即可


class Solution {
    public int maxProfit(int[] prices, int fee) 
    {
        int n = prices.length;
        if(n<=1) return 0;
        int buy[] = new int[n];
        int sell[] = new int[n];
        buy[0] = -prices[0];
        sell[0] = 0;
        for(int i = 1;i<n;i++){
            buy[i] = Math.max(buy[i-1],sell[i-1]-prices[i]);
            sell[i] = Math.max(sell[i-1],buy[i]+prices[i]-fee);
        }
        return Math.max(buy[n-1],sell[n-1]);
    }
}

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

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

相关文章

麒麟kylinOS 2303制作自定义免交互安装镜像

原文链接&#xff1a;麒麟kylinOS 2303制作自定义免交互安装镜像 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇麒麟kylinOS 2303制作自定义免交互ISO安装镜像的文章&#xff0c;内容相对来说比较简单&#xff0c;测试安装了一个360浏览器软件&#xff0c;后续复杂…

c语言练习93:环形链表的约瑟夫问题

环形链表的约瑟夫问题 环形链表的约瑟夫问题_牛客题霸_牛客网 描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是…

【CesiumforUnreal插件】UE5 快速构建Cesium场景 快速入门!!!

目录 0 引言1 快速入门1.1 准备1.2 安装Cesium for Unreal插件并创建一个项目1.3 准备关卡并添加地形和纹理1.4 添加3D建筑到场景中1.5 探索场景 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;CesiumforUnreal专栏&#x1f4a5; 标题&#xff1a…

论坛介绍|COSCon'23开源商业(V)

众多开源爱好者翘首期盼的开源盛会&#xff1a;第八届中国开源年会&#xff08;COSCon23&#xff09;将于 10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01;各位新老朋友们&#xff0c;欢迎到成都&a…

C++数据结构X篇_17_C++实现二叉树的非递归遍历(企业链表实现栈,利用栈的先进后出特点实现二叉树的非递归遍历)

本篇参考C实现二叉树的非递归遍历进行整合介绍。 在C数据结构X篇_14_二叉树的递归遍历&#xff08;先序遍历、中序遍历、后续遍历方法介绍&#xff1b;举例&#xff1b;代码实现&#xff09;中我们实现二叉树通过递归遍历实现了先序、中序与后续遍历&#xff0c;那么如何通过非…

Confluence 自定义博文列表

1. 概述 Confluence 自有博文列表无法实现列表自定义功能&#xff0c;实现该需求可采用页面中引用博文宏标签控制的方式 2. 实现方式 功能入口&#xff1a; Confluence →指定空间→创建页面 功能说明&#xff1a; &#xff08;1&#xff09;页面引用博文宏 &#xff08;…

标准化助推开源发展丨九州未来参编开源领域4项团体标准正式发布

在数字中国及数字经济时代的大背景下&#xff0c;开源逐步成为各行业数字化发展的关键模式。在开源产业迅速发展的同时&#xff0c;如何评估、规范开源治理成为行业极度关注的问题。 近日&#xff0c;中电标2023年第27号团体标准公告正式发布&#xff0c;九州未来作为起草单位…

云表:只需3步,让你搞懂低代码和传统开发有什么区别

自2014年Forrester明确提出低代码&#xff08;Low-Code&#xff09;概念以来&#xff0c;这个领域已经引起了广泛的关注&#xff0c;并逐渐受到越来越多的重视。近年来&#xff0c;低代码因为其低开发门槛、易用性等优点&#xff0c;赢得了众多投资研究机构和企业用户的青睐&am…

【Vue】终结v-model

v-model修饰符 .lazy 默认 v-model 是输入框内容每次改变都会更新数据 加了 .lazy 后,只有在输入框失去焦点时才会更新数据 例如输入用户名,只有离开输入框时才保存用户名 // 输入的时候不会立即加载&#xff0c;等失去焦点时会加载 <input v-model.lazy"msg"…

Python打造一个词云制作软件

文章目录 参数字典布局测试结果 参数字典 自从做了热榜的词云之后&#xff0c;就越来越觉得词云的表达力真的很强&#xff0c;所以合计是不是可以为WordCloud做一个界面&#xff0c;来更加直观地操作。 既然以WordCloud为核心&#xff0c;那么界面的组件自然要和WordCloud的参…

GEO生信数据挖掘(九)肺结核数据-差异分析-WGCNA分析(900行代码整理注释更新版本)

第六节&#xff0c;我们使用结核病基因数据&#xff0c;做了一个数据预处理的实操案例。例子中结核类型&#xff0c;包括结核&#xff0c;潜隐进展&#xff0c;对照和潜隐&#xff0c;四个类别。第七节延续上个数据&#xff0c;进行了差异分析。 第八节对差异基因进行富集分析。…

王道计算机考研 操作系统学习笔记篇章一:操作系统概念

目录 操作系统的概念 操作系统的功能和目标 操作系统的特征 并发 共享 虚拟 异步 操作系统的发展和分类 三大阶段 手工操作阶段 批次处理阶段—单道批处理系统 批处理阶段—多道批处理系统 操作系统分类 分时操作系统 实时操作系统 其他操作系统 操作系统的运行机制 预备知识 …

CV计算机视觉每日开源代码Paper with code速览-2023.10.18

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【语义分割】IDRNet: Intervention-Driven Relation Netw…

图像检索算法 计算机竞赛

文章目录 1 前言2 图像检索介绍(1) 无监督图像检索(2) 有监督图像检索 3 图像检索步骤4 应用实例5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 图像检索算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff…

PlatformIO在clion和vscode上的开发和使用,机器人开发嵌入式代码

vscode PlatformIO:2020年你还在用Arduino&#xff1f;&#xff1f;快开始用PlatformIO开发Esp8266/32、Arduino、STM32&#xff0c;十分钟亲测ESP8266 clion PlatformIO: clion platformio搭建 其他说明&#xff1a; 在vscode里使用platformio&#xff0c;可以选择开发的平台…

MySQL学习(七)——存储过程

文章目录 1. 基本语法2. 变量2.1 系统变量2.2 用户定义变量2.3 局部变量 3. 逻辑关系3.1 if3.2 参数3.3 case3.4 while3.4 repeat3.5 loop 4. 存储结构4.1 游标4.2 条件处理程序4.3 存储函数 存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合&#xff0c;调用存储…

idea dubge 详细

目录 一、概述 二、debug操作分析 1、打断点 2、运行debug模式 3、重新执行debug 4、让程序执行到下一次断点后暂停 5、让断点处的代码再加一行代码 6、停止debug程序 7、显示所有断点 8、添加断点运行的条件 9、屏蔽所有断点 10、把光标移到当前程序运行位置 11、单步跳过 12、…

leetCode 214.最短回文串 + KMP

给定一个字符串 s&#xff0c;你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1&#xff1a; 输入&#xff1a;s "aacecaaa" 输出&#xff1a;"aaacecaaa"示例 2&#xff1a; 输入&#xff1a;s &…

【Java学习之道】JDBC API介绍与使用方法

引言 对于初学者来说&#xff0c;数据库编程可能听起来有些复杂&#xff0c;但实际上&#xff0c;只要你掌握了JDBC&#xff08;Java Database Connectivity&#xff09;API&#xff0c;就可以轻松地连接和操作数据库。本章将为你详细介绍JDBC API的概念、使用方法以及一些实际…

2023年信息院学生科协第二次硬件培训

2023年信息院学生科协第二次硬件培训 前言一、51单片机简介1、什么是单片机2、主流单片机及其编程语言3、单片机的应用4、单片机开发软件 二、GPIO&#xff08;点亮LED&#xff09;1、GPIO简介2、LED简介3、硬件设计4、软件设计 三、GPIO&#xff08;独立按键&#xff09;1、按…