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

阅读目录

    • 1. 题目
    • 2.解题思路
    • 3. 代码实现

1. 题目

2.解题思路

根据题意,每一天有这样几个状态:买入股票、卖出股票、冷冻期、持有股票,因此,我们假设 f 为每天这几个状态下对应的最大收益,由于持有股票时不知道是哪天买入的,所以我们还需要知道当天状态是持有股票时的买入股票价格。因此有:

f [ 0 ] = 当天买入股票后的最大收益 f [ 1 ] = 当天卖出股票后的最大收益 f [ 2 ] = 当天是冷冻期的最大收益 f [ 3 ] = 当天继续持有股票的最大收益 f [ 4 ] = 当天持有股票的买入价格 f[0] = 当天买入股票后的最大收益 \\ f[1] = 当天卖出股票后的最大收益 \\ f[2] = 当天是冷冻期的最大收益 \\ f[3] = 当天继续持有股票的最大收益 \\ f[4] = 当天持有股票的买入价格 \\ f[0]=当天买入股票后的最大收益f[1]=当天卖出股票后的最大收益f[2]=当天是冷冻期的最大收益f[3]=当天继续持有股票的最大收益f[4]=当天持有股票的买入价格

状态转移时,

i − 1 i-1 i1 天是冷冻期,第 i i i 天才可以买入,所以有 f [ i ] [ 0 ] = f [ i − 1 ] [ 2 ] f[i][0]=f[i-1][2] f[i][0]=f[i1][2]

i − 1 i-1 i1 天是买入股票或者持有股票,第 i i i 天才可以卖出,状态是二者的较大值,所以有 f [ i ] [ 1 ] = m a x ( f [ i − 1 ] [ 0 ] + p r i c e s [ i ] − p r i c e s [ i − 1 ] , f [ i − 1 ] [ 3 ] + p r i c e s [ i ] − f [ i − 1 ] [ 4 ] ) f[i][1]=max(f[i-1][0] + prices[i] - prices[i-1], f[i-1][3] + prices[i] - f[i-1][4]) f[i][1]=max(f[i1][0]+prices[i]prices[i1],f[i1][3]+prices[i]f[i1][4])

i − 1 i-1 i1 天是卖出或者冷冻期,第 i i i 天才可以是冷冻期,所以有 f [ i ] [ 2 ] = m a x ( f [ i − 1 ] [ 2 ] , f [ i − 1 ] [ 1 ] ) f[i][2]=max(f[i-1][2], f[i-1][1]) f[i][2]=max(f[i1][2],f[i1][1])

i − 1 i-1 i1 天是买入或者持有,第 i i i 天才可以是持有,这时候,我们需要比较是买入-持有获得的价值大还是持有-持有获得的价值大,前者的价值是 f [ i − 1 ] [ 0 ] − p r i c e s [ i − 1 ] f[i-1][0] - prices[i-1] f[i1][0]prices[i1],后者的价值是 f [ i − 1 ] [ 3 ] − f [ i − 1 ] [ 4 ] f[i-1][3] - f[i-1][4] f[i1][3]f[i1][4]。如果前者的价值大,则更新 f [ i ] [ 3 ] = f [ i − 1 ] [ 0 ] , f [ i ] [ 4 ] = p r i c e s [ i − 1 ] f[i][3]=f[i-1][0],f[i][4]=prices[i-1] f[i][3]=f[i1][0]f[i][4]=prices[i1],如果后者的价值大,则更新 f [ i ] [ 3 ] = f [ i − 1 ] [ 3 ] , f [ i ] [ 4 ] = f [ i − 1 ] [ 4 ] f[i][3]=f[i-1][3],f[i][4]=f[i-1][4] f[i][3]=f[i1][3]f[i][4]=f[i1][4]

3. 代码实现

class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) == 1:return 0ret = 0# dp[0] 代表当天买入股票后的最大收益# dp[1] 代表当天卖出股票后的最大收益# dp[2] 代表当天是冷冻期的最大收益# dp[3] 代表当天是持有股票后的最大收益# dp[4] 代表当天是持有股票,买入的股票价格dp = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]dp[1][1] = prices[1] - prices[0]dp[1][4] = prices[0]ret = max(ret, dp[1][1])for i in range(2, len(prices)):dp.append([0, 0, 0, 0, 0])dp[i][0] = dp[i -1][2]dp[i][1] = max(prices[i] - prices[i-1] + dp[i-1][0],prices[i] - dp[i-1][4] + dp[i-1][3])ret = max(ret, dp[i][1])dp[i][2] = max(dp[i-1][1], dp[i-1][2])buy_hold = dp[i-1][0] - prices[i-1]hold_hold = dp[i-1][3] - dp[i-1][4]if buy_hold > hold_hold:dp[i][3] = dp[i-1][0]dp[i][4] = prices[i-1]else:dp[i][3] = dp[i-1][3]dp[i][4] = dp[i-1][4]return ret

注意,如果初始化 d p = [ [ 0 , 0 , 0 , 0 , 0 ] ] ∗ l e n ( p r i c e s ) dp = [[0, 0, 0, 0, 0]] * len(prices) dp=[[0,0,0,0,0]]len(prices),那么 d p dp dp 中所有的列表都是同一个,修改一个所有的都会跟着变动。

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

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

相关文章

RocketMQ学习笔记:消息存储模型,持久化文件,过期文件删除

这是本人学习的总结,主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、消息存储结构1.1、CommitLog详解1.1.1、CommitLog存储的优点 1.2、ConsumeQueue详解1.3、Index详解 2、持久化文件3、过期文件删除机制3.1、判断过期文件3.2、删除的时机 1、消息存储结构…

Navicat15安装教程

直接开始Navicat15的安装教程 下载好上面的资源,解压后得到以下文件 1. 安装 Navicat ①双击 navicat150_premium_cs_x64.exe,准备安装 Navicat 15 ②无脑一直下一步就行,到下图画面就安装成功了。 2.安装完成以后,先不要启动…

第三十一天-Flask-ORM-sqlalchemy

目录 1.什么是ORM 2.flask-sqlalchemy 1安装 2.配置 3.数据库模型设计 ​编辑 4.插入修改删除 5.查询 1.什么是ORM 2.flask-sqlalchemy 1安装 2.配置 3.数据库模型设计 4.插入修改删除 5.查询

LangChain核心概念与组件

Chains Chains可以让你按照一定的顺序和逻辑来执行不同的任务。Chains有以下四种类型: 类型作用LLMChain用于在语言模型周围添加一些功能的简单Chain,它由一个PromptTemplate和一个语言模型(LLM或chat model)组成,它…

python(django)之单一接口管理功能后台开发

1、创建数据模型 在apitest/models.py下加入以下代码 class Apis(models.Model):Product models.ForeignKey(product.Product, on_deletemodels.CASCADE, nullTrue)# 关联产品IDapiname models.CharField(接口名称, max_length100)apiurl models.CharField(接口地址, max_…

住在我心里的猴子:焦虑那些事儿 - 三余书屋 3ysw.net

精读文稿 您好,本期我们解读的是《住在我心里的猴子》。这是一本由患有焦虑症的作家所著,关于焦虑症的书。不仅如此,作者的父母和哥哥也都有焦虑症,而作者的母亲后来还成为了治疗焦虑症的专家。这本书的中文版大约有11万字&#x…

深度学习模型部署(十二)CUDA编程-绪

CUDA 运行时 API 与 CUDA 驱动 API 速度没有差别,实际中使用运行时 API 较多,运行时 API 是在驱动 API 上的一层封装。​ CUDA 是什么?​ CUDA(Compute Unified Device Architecture) 是 nvidia 推出的一个通用并行技术架构,用它…

【蓝桥杯】填空题技巧|巧用编译器|用Python处理大数和字符|心算手数|思维题

目录 一、填空题 1.巧用编译器 2.巧用Excel 3. 用Python处理大数 4.用Python处理字符 5.心算手数 二、思维题 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击跳转到网站】 一、填空题 …

【考研数学】张宇全程学习包

可以全程张宇老师的高等数学,张宇老师的拿手绝活是高数 但是其他科目,还有更好的选择,比如线性代数,汤家凤老师还有李永乐老师讲的都不错,概率论,余丙森老师还有方浩老师讲的很好。下面我就讲清楚&#xf…

AI 视频 | 火爆全网的真人转动漫工具 DomoAI,又上新功能了!(三)

DomoAI 又又又上线新功能了! 上传一张静态人像图片 一个人像动作视频,就可以生成两者融合的动态视频。 啥都不说,直接看官方的示例视频: DomoAI 新功能 move 官方示例视频 使用非常简单,在 Discord 中通过 /move 指…

C++ 动态规划

文章目录 一、简介二、举个栗子2.1斐波那契数列2.2最短路径(DFS) 参考资料 一、简介 感觉动态规划非常的实用,因此这里整理一下相关资料。动态规划(Dynamic Programming):简称 DP,是一种优化算法…

【JavaEE初阶系列】——多线程案例一——单例模式 (“饿汉模式“和“懒汉模式“以及解决线程安全问题)

目录 🚩单例模式 🎈饿汉模式 🎈懒汉模式 ❗线程安全问题 📝加锁 📝执行效率提高 📝指令重排序 🍭总结 单例模式,非常经典的设计模式,也是一个重要的学科&#x…

摆扫式(whisk broom)和推扫式(push broom)卫星传感器介绍

目前,我们卫星传感器主要有两大类型:摆扫式(whisk broom)和推扫式(push broom)。为了更好的理解和使用卫星影像数据,我们需要简单了解下这两种传感器工作原理。 摆扫式:Whisk Broom…

搭建Hadoop HA

目录 前言 搭建前准备 搭建 前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构,它允许用户在不了解分布式底层细节的情况下开发分布式程序,充分利用集群的威力进行高速运算和存储。Hadoop主要解决大数据存储和大数据分析两大核心问题&…

Phoenix概念篇

文章目录 前言Phoenix的web层概念PlugEndpointRouterScopePipeline ControllerAction Component 一次请求 前言 Elixir和Phoenix的作者也是Rails社区的核心开发者,如果是之前接触过Ruby on Rails的开发者,对Phoenix也许不会感到太陌生。笔者没有接触过R…

【报错】使用gradio渲染html页面无法加载本地图片

【报错】使用gradio渲染html页面无法加载本地图片 【报错】使用gradio渲染html页面无法加载本地图片[HTML] how to load local image by html output #884成功解决 【报错】使用gradio渲染html页面无法加载本地图片 在使用gradio框架渲染html页面,使用绝对路径&quo…

BUUCTF-Misc14

[WUSTCTF2020]find_me1 1.打开附件 是一个学校的校徽 2.盲文解密 发现图片属性里的备注是一串盲文 用在线盲文解密 3.得到flag

C语言笔记:重学输入和输出

ACM金牌带你零基础直达C语言精通-课程资料 本笔记属于船说系列课程之一,课程链接:ACM金牌带你零基础直达C语言精通https://www.bilibili.com/cheese/play/ep159068?csourceprivate_space_class_null&spm_id_from333.999.0.0 你也可以选择购买『船说…

AI新工具 视频迁移升级中国水墨画风格2.0;新颖的视频编辑框架提示编辑,风格转移,身份操控都不在话下;提取多种风格人脸草图

✨ 1: DomoAI 升级中国水墨画风格2.0 DomoAI是一个多功能的AI视频处理工具,可以将视频转换成多种风格,包括日本动漫、3D卡通、漫画和像素风格等。用户只需上传原始视频,通过简单的操作就能实现风格转换,制作出具有个性的高质量视…

“架构(Architecture)” 一词的定义演变历史(依据国际标准)

深入理解“架构”的客观含义,不仅能使IT行业的系统架构设计师提升思想境界,对每一个积极的社会行动者而言,也具有长远的现实意义,因为,“架构”一词,不只限于IT系统,而是指各类系统(包括社会系统…