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,一经查实,立即删除!

相关文章

代码随想录day45:单调栈篇

文章目录 day45&#xff1a;单调栈篇739.每日温度496.下一个更大元素 I day45&#xff1a;单调栈篇 739.每日温度 class Solution {public int[] dailyTemperatures(int[] temperatures) {int n temperatures.length;int[] ans new int[n];Stack<Integer> stack new…

mysql 截取字符串及解析json

mysql 截取字符串sql SELECT substring_index(upload_pic_file,/,-1) from erp_reject_loss_approvalmysql 解析json json字符串解析 MySQL解析JSON字符串&#xff0c;可以使用MySQL的JSON函数。 使用JSON_EXTRACT函数来提取JSON字符串中的特定值。例如&#xff1a; SELE…

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

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

Navicat15安装教程

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

第三十一天-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有以下四种类型&#xff1a; 类型作用LLMChain用于在语言模型周围添加一些功能的简单Chain&#xff0c;它由一个PromptTemplate和一个语言模型&#xff08;LLM或chat model&#xff09;组成&#xff0c;它…

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

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

CISP 4.2备考之《信息安全管理》知识点总结

文章目录 一、信息安全管理基础二、信息安全风险管理三、27001 信息安全管理体系&#xff08;PDCA&#xff09;四、ISO/IEC 27002:2013 信息安全管理控制措施五、信息安全管理测量 一、信息安全管理基础 管理的概念&#xff1a;组织、协调、控制的活动&#xff0c;核心过程的管…

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

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

【C++】每日一题,238 除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂…

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

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

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

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

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

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

一文搞定 FastAPI 查询参数

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

C++ 动态规划

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

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

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

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

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

Spring Boot的作用

Spring Boot 是一个开源的 JavaEE 框架&#xff0c;它可以帮助开发者快速构建基于 Spring 框架的应用程序 项目初始化&#xff1a; 在你的开发环境中安装 Java 开发工具&#xff08;如 JDK&#xff09;。在项目管理工具&#xff08;如 Maven、Gradle&#xff09;中创建一个新的…

搭建Hadoop HA

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