股票买卖问题:状态定义的误解与思考

文章目录

  • 问题
  • 状态的定义与理解
    • 状态定义
    • 状态转移函数
    • 困惑
    • 思考
  • 反思
  • 参考资料

问题

股票买卖问题是动态规划中常考的题型,题目一般是给一个 p r i c e s prices prices的数组,每个元素代表当天的股票价格,再给你一个 k k k值,代表允许交易的最大次数,最终让你求出能获得的最大利润。

状态的定义与理解

状态定义

d p [ i ] [ k ] [ s ] dp[i][k][s] dp[i][k][s]

  • i i i:第 i i i天;
  • k k k:交易的最大次数(这里有很多歧义,理解部分重点解释);
  • s s s:持有状态,0代表不持有,1代表持有。

举个例子, d p [ 3 ] [ 1 ] [ 0 ] dp[3][1][0] dp[3][1][0]代表在第三天,我至今最多进行了1次交易,现在没有持有的最大利润是多少。

状态转移函数

借用东哥的一个图理解下:

  • d p [ i ] [ k ] [ 0 ] = m a x ( d p [ i − 1 ] [ k ] [ 0 ] , d p [ i − 1 ] [ k ] [ 1 ] + p r i c e s [ i ) dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i) dp[i][k][0]=max(dp[i1][k][0],dp[i1][k][1]+prices[i)
  • 理解:当天不持有的最大利润 = m a x max max(前一天就不持有,前一天持有但是今天卖出了)
  • d p [ i ] [ k ] [ 1 ] = m a x ( d p [ i − 1 ] [ k ] [ 1 ] , d p [ i − 1 ] [ k − 1 ] [ 0 ] − p r i c e s [ i ] ) dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i]) dp[i][k][1]=max(dp[i1][k][1],dp[i1][k1][0]prices[i])
  • 理解:当天不持有的最大利润 = m a x max max(前一天就持有,前一天不持有但是今天买入了)

这里有个细节是, k k k是在买入动作进行更新的。如果卖出的时候才更新,会出现超出交易次数的限制。
在这里插入图片描述

困惑

这里我最开始看对 k k k的变化有个疑问:

为什么计算 d p [ i ] [ k ] [ 1 ] dp[i][k][1] dp[i][k][1]的时候,认为前一天不持有的状态是 d p [ i − 1 ] [ k − 1 ] [ 0 ] dp[i-1][k-1][0] dp[i1][k1][0]而不是 d p [ i − 1 ] [ k − 1 ] [ 0 ] dp[i-1][k-1][0] dp[i1][k1][0]

如果在 i i i天买入后的交易次数上限是 k k k i − 1 i-1 i1天的交易次数上限不应该是 k + 1 k+1 k+1吗,怎么可能是 k − 1 k-1 k1呢?

不得不说这个地方东哥在书里的一句描述给了我很大的误解:
在这里插入图片描述

思考

还是要回到 d p [ i ] [ k ] [ s ] dp[i][k][s] dp[i][k][s]的定义上来,这个 k k k代表的到底是什么?

  • 理解1:按照东哥上面红框这个描述,我本来的理解是:到第 i i i天,我还「剩下的最大交易次数」;❌
  • 理解2:到第k天「已经进行的交易次数」;❌
  • 理解3到第k天为止「最多已经进行的交易次数」!✅ (其实在前文东哥举例子的时候是这么说的,但是后面改了个说法我就晕了…笨笨子)

为什么理解3就是通的呢?还是回到我最初的那个困惑:

为什么计算 d p [ i ] [ k ] [ 1 ] dp[i][k][1] dp[i][k][1]的时候,认为前一天不持有的状态是 d p [ i − 1 ] [ k − 1 ] [ 0 ] dp[i-1][k-1][0] dp[i1][k1][0]而不是 d p [ i − 1 ] [ k + 11 ] [ 0 ] dp[i-1][k+11][0] dp[i1][k+11][0]

你想呀,如果是理解1(剩下的最大交易次数),今天买入交易了一次变成了 k k k,那昨天剩下的次数一定比今天多一次才行,就应该是 d p [ i − 1 ] [ k + 1 ] [ 0 ] dp[i-1][k+1][0] dp[i1][k+1][0]

如果是理解2,状态转移函数和最后的返回值就要大改了,显然不是一个合适的状态定义。

如果是理解3,一切就合乎情理了,本来题目说的也是最多允许交易 k k k次,如果到第 i i i天最多已经进行的交易次数是 k k k,且在第 i i i天我们进行了买入的操作,那么第 i − 1 i-1 i1天当然最多已经进行的交易次数是 k − 1 k-1 k1了。

反思

股票买卖题型我至少刷了3次了,竟然今天才产生这样的疑问,说明之前理解的并不透彻,更多是浮在表面的记忆层面,一味追求提交通过。希望后面的刷题之路中,多一点类似的深度思考,真正弄懂弄透,把刷题变成有趣的事情。
在这里插入图片描述

参考资料

  1. 《labuladong的算法小抄》

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

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

相关文章

pycharm 历史版本下载地址

pycharm 历史版本下载地址 老版本能用就行,不需要搞最新的,当然了,有些小伙伴就是喜欢新的(最先吃螃蟹) 博主就不搞最新了,哈哈 上菜: https://www.jetbrains.com/pycharm/download/other.html…

01初识Python

一、Python 简介 二、为什么要学Python? 三、Python 安装 四、输出第一条指令 五、总结 一、Python 简介 Python是一种高级编程语言,由Guido van Rossum于1991年创建。它具有简单易学的语法结构,被广泛应用于Web开发、数据科学、人工智能等领域。 Python具有丰富的库…

Windows→Linux,本地同步到服务器

适用背景&#xff1a; 用自己电脑修改代码&#xff0c;使用实验室/公司的服务器炼丹的朋友 优势&#xff1a; 本地 <--> 服务器&#xff0c;实时同步&#xff0c;省去文件传输的步骤 本地改 -> 自动同步到服务器 -> 服务器跑代码 -> 一键同步回本地&#xff…

瑞熙贝通打造智慧校园实验室安全综合管理平台

一、建设思路 瑞熙贝通实验室安全综合管理平台是基于以实验室安全&#xff0c;用现代化管理思想与人工智能、大数据、互联网技术、物联网技术、云计算技术、人体感应技术、语音技术、生物识别技术、手机APP、自动化仪器分析技术有机结合&#xff0c;通过建立以实验室为中心的管…

Redisinsight默认端口改成5540了!网上的8001都是错误的

Redisinsight 打开白屏解决方法 最近发现一个很讨厌的bug&#xff0c;就是redisinsight运行之后&#xff0c;不行了&#xff0c;在网上找到的所有资料里面&#xff0c;redis insight都是运行在8001端口&#xff0c;但是我现在发现&#xff0c;变成了5540 所以对应的docker-com…

【C++】类和对象终章

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、初始化列表1.1 初始化列表的形式1.2 初始化列表的注意事项 二、explicit关键…

@RequestParam、@PathVariable、@RequestBody

1、中文翻译 RequestParam-请求参数、PathVariable-路径变量、RequestBody请求体 2、作用&#xff1a; Controller中获取前端传递的参数 3、从注解本身角度分析 3.1、PathVariable&#xff1a;路径变量 通过 PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形…

CSS3病毒病原体图形特效

CSS3病毒病原体图形特效&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 CSS3病毒病原体图形特效代码

(二)移植FreeRTOS到STM32中

一、概念 &#xff08;1&#xff09;任务&#xff08;线程&#xff09;&#xff1a;根据功能的不同&#xff0c;将一个系统分割成一个个独立且无法返回的函数&#xff0c;这个函数就被称为任务 &#xff08;2&#xff09;任务栈&#xff1a;静态创建的任务保存在栈中 &#xf…

Formate函数的一般使用

Program Project2;{$APPTYPE CONSOLE}UsesSysUtils;Varnum: Integer;r1: Real;BeginRead(num, r1);Writeln(Format(%d 绝对值%%d&#xff1a;%d, [num, abs(num)]));Writeln(Format(%u 绝对值%%u&#xff1a;%u, [num, abs(num)]));Writeln(Format(%f 参数为浮点数&#xff0c;…

前后端分离:现代Web开发的协作模式

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

el-cascader修改样式(不影响全局)

当用/deep/想像往常一样修改&#xff0c;会发现不生效&#xff0c;原因在于这个组件和div#app同级了&#xff0c;如果去掉scoped&#xff0c;是最简单的方法&#xff0c;当然&#xff0c;为了不影响全局我们当然不能这么做。 以下是步骤&#xff1a; 1.我们查看组件属性&…

镜像制作实战篇

“ 在失控边缘冲杀为&#xff0c;最终解脱” CMD与EntryPoint实战 EntryPoint 与 CMD都是docker 镜像制作中的一条命令&#xff0c;它们在概念上可能有些相似&#xff0c;但在使用中&#xff0c;两者是有明显的区别的。比如&#xff0c;执行一个没有调用EntryPoint、CMD的容器会…

#QT(事件--快捷键保存文件)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;QEvent,QMouseEvent,QKeyEvent。 在上一个文本编辑器的基础上实现快捷键"ctrls"保存文件。 3.记录 &#xff08;1&#xff09;查看QEVENT的有效事件 &#xff08;2&#xff09; 所有时间均继承于QEvent&#xff0c;任…

微信小程序《简单、快速上手的微信小程序音乐播放器》+源代码+文档说明

文章目录 源代码下载地址项目介绍项目功能使用方法界面预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 首页&#xff1a;歌曲歌手搜索&#xff0c;轮播图&#xff0c;各大榜单&#xff0c;热门歌单 正在播放&#xff1a; 当前播放歌曲展示…

Parade Series - Web Streamer Low Latency

Parade Series - FFMPEG (Stable X64) 延时测试秒表计时器 ini/config.ini [system] homeserver storestore\nvr.db versionV20240312001 verbosefalse [monitor] listrtsp00,rtsp01,rtsp02 timeout30000 [rtsp00] typelocal deviceSurface Camera Front schemartsp ip127…

如何从不同维度对服务进行拆分

1.压力模型 高频高并发 商品详情页 低频突发流量 如秒杀 批量上架 2.主链路规划 不可缺少的环节 如果缺少了就无法形成完整的服务 如图营销计算就是一个服务业务 3.领域模型拆分DDD 4.用户群体拆分 2C 2B

springboot整合swagger,postman,接口规范

一、postman介绍 1.1概述 工具下载 Postman&#xff08;发送 http 请求的工具&#xff09; 官网&#xff08;下载速度比较慢&#xff09;&#xff1a;Download Postman | Get Started for Free 网盘下载&#xff1a;百度网盘 请输入提取码 1.2Http 请求格式 请求地址请求方法状…

VsCode 配置go开发环境之下载go tools

ctrl shift P 选择 go install/update tools&#xff0c;下载go tools 报错&#xff0c; 提升dial err。 将GOPROXY 和 GOSUMDB 按照如下配置&#xff0c;重启IDE即可成功下载 set GOPROXYhttps://goproxy.cn set GOSUMDBoff

jupyter中pip安装包会安装到别的环境。

文章目录 1. 查看jupyter当前环境和默认环境的路径和python版本2.安装包到正确的环境 如果你在 Jupyter Notebook 中使用 pip 安装包&#xff0c;它默认会将包安装到 Jupyter Notebook 所在的Python 环境。这可能会导致安装的包与你期望的环境不匹配。 1. 查看jupyter当前环境和…