leetcode 309. Best Time to Buy and Sell Stock with Cooldown

目录

题目描述

第一步,明确并理解dp数组及下标的含义

第二步,分析并理解递推公式

1.求dp[i][0]

2.求dp[i][1]

3.求dp[i][2]

第三步,理解dp数组如何初始化

第四步,理解遍历顺序

代码


题目描述

这道题与第122题的区别就是卖出股票后的一天不能买股票。仍然用动态规划解决。这类题目的关键是要分析每一天有几种状态,用dp数组变量记录这些状态。 

第一步,明确并理解dp数组及下标的含义

//dp[i][0]表示从第0天开始一直到第i天结束时,处于持有股票的状态,此时的最大利润

//dp[i][1]表示从第0天开始一直到第i天结束时,由于第i天卖出股票此时处于不持有股票的状态,此时的最大利润

//dp[i][2]表示从第0天开始一直到第i天结束时,由于第i天之前卖出股票并且第i天没有卖出股票此时处于不持有股票的状态,此时的最大利润

        int n = prices.size();//dp[i][0]表示从第0天开始一直到第i天结束时,处于持有股票的状态,此时的最大利润//dp[i][1]表示从第0天开始一直到第i天结束时,由于第i天卖出股票此时处于不持有股票的状态,此时的最大利润//dp[i][2]表示从第0天开始一直到第i天结束时,由于第i天之前卖出股票并且第i天没有卖出股票此时处于不持有股票的状态,此时的最大利润vector<vector<int>> dp(n,vector<int>(3,0));

第二步,分析并理解递推公式

1.求dp[i][0]

//第i天结束时处于持有股票的状态,有两种可能的原因:

//一是前一天(第i-1天)结束时就已经处于持有股票的状态(对应状态dp[i-1][0]),第i天什么也不做。

//二是第i天买入了股票(需支付prices[i]),第i天能买入股票的前提是第i-1天结束时就已经处于不持有股票的状态(并且第i-1天没有卖出股票)(对应状态dp[i-1][2])。

dp[i][0] = max(dp[i-1][0],dp[i-1][2] - prices[i]);

2.求dp[i][1]

//第i天结束时处于不持有股票的状态并且是因为第i天卖出了股票,第i天能卖出股票的前提是第i-1天结束时处于持有股票的状态(对应dp[i-1][0])

dp[i][1] = dp[i-1][0] + prices[i];

3.求dp[i][2]

//第i天结束时处于不持有股票的状态并且第i天没有卖出股票,有两种可能的原因:

//一是前一天(第i-1天)卖出了股票导致第i-1天结束时处于不持有股票的状态(对应状态dp[i-1][1])。

//二是前一天(第i-1天)的之前卖出了股票,而不是前一天的当天卖出了股票,导致第i-1天结束时处于不持有股票的状态(对应状态dp[i-1][2])。

dp[i][2] = max(dp[i-1][1],dp[i-1][2]);

        for(int i = 1;i < n;i++){//第i天结束时处于持有股票的状态,有两种可能的原因://一是前一天(第i-1天)结束时就已经处于持有股票的状态(对应状态dp[i-1][0]),第i天什么也不做。//二是第i天买入了股票(需支付prices[i]),第i天能买入股票的前提是第i-1天结束时就已经处于不持有股票的状态(并且第i-1天没有卖出股票)(对应状态dp[i-1][2])。dp[i][0] = max(dp[i-1][0],dp[i-1][2] - prices[i]);//第i天结束时处于不持有股票的状态并且是因为第i天卖出了股票,第i天能卖出股票的前提是第i-1天结束时处于持有股票的状态(对应dp[i-1][0])dp[i][1] = dp[i-1][0] + prices[i];//第i天结束时处于不持有股票的状态并且第i天没有卖出股票,有两种可能的原因://一是前一天(第i-1天)卖出了股票导致第i-1天结束时处于不持有股票的状态(对应状态dp[i-1][1])。//二是前一天(第i-1天)的之前卖出了股票,而不是前一天的当天卖出了股票,导致第i-1天结束时处于不持有股票的状态(对应状态dp[i-1][2])。dp[i][2] = max(dp[i-1][1],dp[i-1][2]);}

第三步,理解dp数组如何初始化

dp[0][0] = -prices[0];//第0天结束时处于持有股票的状态,那只能是因为第0天买入了股票(需支付prices[0]),利润为负prices[0]

dp[0][1] = 0;//第0天结束时处于不持有股票的状态,并且是因为第0天卖出了股票,可以理解为第0天先买入了股票然后又卖出了,最终利润是0

dp[0][2] = 0;//第0天结束时处于不持有股票的状态,并且第0天没有卖出股票,只能是因为第i天什么也没做,利润保持为初始值0

第四步,理解遍历顺序

第i天的状态依赖于第i-1天的状态,因此i的遍历顺序应该从小到大。

代码

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();//dp[i][0]表示从第0天开始一直到第i天结束时,处于持有股票的状态,此时的最大利润//dp[i][1]表示从第0天开始一直到第i天结束时,由于第i天卖出股票此时处于不持有股票的状态,此时的最大利润//dp[i][2]表示从第0天开始一直到第i天结束时,由于第i天之前卖出股票并且第i天没有卖出股票此时处于不持有股票的状态,此时的最大利润vector<vector<int>> dp(n,vector<int>(3,0));dp[0][0] = -prices[0];//第0天结束时处于持有股票的状态,那只能是因为第0天买入了股票(需支付prices[0]),利润为负prices[0]dp[0][1] = 0;//第0天结束时处于不持有股票的状态,并且是因为第0天卖出了股票,可以理解为第0天先买入了股票然后又卖出了,最终利润是0dp[0][2] = 0;//第0天结束时处于不持有股票的状态,并且第0天没有卖出股票,只能是因为第i天什么也没做,利润保持为初始值0for(int i = 1;i < n;i++){//第i天结束时处于持有股票的状态,有两种可能的原因://一是前一天(第i-1天)结束时就已经处于持有股票的状态(对应状态dp[i-1][0]),第i天什么也不做。//二是第i天买入了股票(需支付prices[i]),第i天能买入股票的前提是第i-1天结束时就已经处于不持有股票的状态(并且第i-1天没有卖出股票)(对应状态dp[i-1][2])。dp[i][0] = max(dp[i-1][0],dp[i-1][2] - prices[i]);//第i天结束时处于不持有股票的状态并且是因为第i天卖出了股票,第i天能卖出股票的前提是第i-1天结束时处于持有股票的状态(对应dp[i-1][0])dp[i][1] = dp[i-1][0] + prices[i];//第i天结束时处于不持有股票的状态并且第i天没有卖出股票,有两种可能的原因://一是前一天(第i-1天)卖出了股票导致第i-1天结束时处于不持有股票的状态(对应状态dp[i-1][1])。//二是前一天(第i-1天)的之前卖出了股票,而不是前一天的当天卖出了股票,导致第i-1天结束时处于不持有股票的状态(对应状态dp[i-1][2])。dp[i][2] = max(dp[i-1][1],dp[i-1][2]);}return max(dp[n-1][1],dp[n-1][2]);}
};

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

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

相关文章

嵌入式硬件常用总线接口知识体系总结和对比

0.前言 在嵌入式工程实现中,多多少少我们都使用过总线,各种各样的总线应用于不同场合,不同场景有不同的优势,但是我们在作为工程师过程中在如何选择项目合适的总线,根据什么来选?需要我们对项目全局和总线特征有所了解,本文目的就是对比多种总线的关键特征 我们在聊到…

数据分析处理库Pandas常用方法汇总

目录 一、基础操作 1.1 创建df对象 1.1.1 读入表格数据 1.1.2 手动创建df 1.2 .info() 1.3 df.index 1.4 df.columns 1.5 df.dtypes 1.6 df.values 1.7 .set_index() 1.8 df[xxx] 1.9 .describe() 1.10 .isin() 1.12 .where() 1.13 .query() 1.14 Series类型运算…

智慧大屏系统

延凡智慧大屏系统旨在打破数据壁垒&#xff0c;将海量、复杂的数据转化为直观易懂的可视化图形和信息&#xff0c;广泛应用于城市管理、企业运营、交通指挥、能源监控等多个领域&#xff0c;为管理者、决策者提供全面、实时、精准的信息展示和分析工具&#xff0c;助力高效决策…

树莓派超全系列教程文档--(32)config.txt常用音频配置

config.txt常用音频配置 板载模拟音频&#xff08;3.5mm耳机插孔&#xff09;audio_pwm_modedisable_audio_ditherenable_audio_ditherpwm_sample_bits HDMI音频 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 板载模拟音频&#xff08;3.5mm耳机…

23种设计模式全面解析

设计模式是解决软件设计中常见问题的经典方案。根据《设计模式&#xff1a;可复用面向对象软件的基础》&#xff08;GoF&#xff09;&#xff0c;23种设计模式分为以下三类&#xff1a; 一、创建型模式&#xff08;5种&#xff09; 目标&#xff1a;解耦对象的创建过程&#x…

AI 推理框架详解,包含如COT、ReAct、LLM+P等的详细说明和分类整理,涵盖其原理、应用场景及对比分析

AI 推理引擎 以下是关于 AI 推理引擎 的详细说明&#xff0c;涵盖其定义、类型、核心组件、技术实现、应用场景及挑战&#xff1a; 1. 推理引擎的定义 推理引擎&#xff08;Inference Engine&#xff09;是 AI系统的核心组件&#xff0c;负责根据输入数据、知识库或预训练模…

《探秘鸿蒙分布式软总线:开启无感发现与零等待传输新时代》

在数字化浪潮中&#xff0c;设备之间的互联互通成为构建智能生态的关键。鸿蒙系统中的分布式软总线技术&#xff0c;宛如一座桥梁&#xff0c;让各种智能设备紧密相连。尤其是其实现的设备间无感发现和零等待传输功能&#xff0c;更是为用户带来了前所未有的便捷体验&#xff0…

JDBC 与 MyBatis 详解:从基础到实践

目录 一、JDBC 介绍 二、使用 JDBC 查询用户信息 三、ResultSet 结果集 四、预编译 SQL - SQL 注入问题 五、预编译 SQL - 性能更高 六、JDBC 增删改操作 插入数据&#xff1a; 更新数据&#xff1a; 删除数据&#xff1a; 七、MyBatis 介绍 八、MyBatis 入门程序 引…

基于SpringBoot成绩管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

<sql>、<resultMap>、<where>、<foreach>、<trim>、<set>等标签的作用和用法

目录 一. sql 代码片段标签 二. resultMap 映射结果集标签 三. where 条件标签 四. set 修改标签 五. trim 标签 六. foreach 循环标签 一. sql 代码片段标签 sql 标签是 mybatis 框架中一个非常常用的标签页&#xff0c;特别是当一张表很有多个字段多&#xff0c;或者要…

《MySQL:MySQL数据库的基本操作》

1.创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 大写表示关键字[]&#xff1a;表示可选项CHARACTER SET ch…

深入简出:KL散度、交叉熵、熵、信息量简介、交叉熵损失

学习这些的最终目的 1、量化两个概率分布的差异 2、推导交叉熵损失 一、KL散度 KL散度就是用来量化两个概论分布的差异&#xff0c;如何量化&#xff1f; 计算真实概论分布P信息量 和 估计概论分布为Q&#xff0c;但实际概率分布为P时信息量的差值 那么设&#xff0c;概率分…

MySQL:Join连接的原理

连接查询的执行过程&#xff1a; 确定第一个需要查询的表【驱动表】 选取代价最小的访问方法去执行单表查询语句 从驱动表每获取到一条记录&#xff0c;都需要到t2表中查找匹配的记录 两表连接查询需要查询一次t1表&#xff0c;两次t2表&#xff0c;在两表的连接查询中&…

【Drools+springboot3规则匹配】

文章目录 一、 业务场景概述二、整体技术架构三、Drools概述1. Drools 简介2. Drools Rete 算法与flink-cep的区别?2.1 Rete 算法概述2.2 Flink CEP 概述四、代码实现4.1 导入依赖4.2 从kafka消费数据4.3 核心类,触发匹配操作并将匹配数据写入mysql4.4 Drools 管理4.5 相关的…

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的&#xff0c;几乎维系着整个安卓程序运行的生命周期&#xff0c;但是这么重要的一个东西&#xff0c;我们真的了解它吗&#xff1f;下面跟随着我的脚步&#xff0c;慢慢揭开Hanler的神秘面纱吧&#xff01; 本文将介绍Handler 的运…

读书笔记 -- MySQL架构

1、MySQL逻辑架构 最上层的服务并不是 MySQL所独有的&#xff0c;大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。 第二层架构是 MySQL 比较有意思的部分。大多数 MySQL 的核心服务功能都在这一层包括查询解析、分析、…

linux 4.14内核jffs2文件系统不自动释放空间的bug

前段时间在做spi-nor flash项目的时候&#xff0c;使用jffs2文件系统&#xff0c;发现在4.14内核下存在无法释放空间的bug&#xff0c;后来进行了修复&#xff0c;修复后功能正常&#xff0c;现将修复patch公开&#xff0c;供后来者学习&#xff1a; diff --git a/fs/jffs2/ac…

vue3+vite 实现.env全局配置

首先创建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依赖&#xff1a; pnpm install dotenv --save-dev 引入完成后&#xff0c;在vite.config.js配置文件内加入以下内容&#xff1a; const env dotenv.config({ path: ./.env }).parsed define: { // 将…

Oracle 19c部署之手工建库(四)

#Oracle #19c #手工建库 手工创建Oracle数据库&#xff08;也称为手工建库&#xff09;是指在已经安装了Oracle数据库软件的基础上&#xff0c;通过手动执行一系列命令和步骤来创建一个新的数据库实例。这种方法与使用Database Configuration Assistant (DBCA)等工具自动创建数…