171、【动态规划】leetcode ——309. 最佳买卖股票时机含冷冻期 (C++版本)

news2024/9/9 4:26:19

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原题链接:309. 最佳买卖股票时机含冷冻期

解题思路

本次难点在于多了一个冷冻期,大体的状态过程是三个:持有股票不持有股票冷冻期。在不持有股票时候,又可分为之前就不持有股票并继续保持今天才卖出股票明天是冷冻期

(1)四种状态dp

  • 动态规划五步曲:

(1)dp数组含义:

为了详细分析,分为包含四个状态,分别为:dp[i][0]:持有股票时最大收益状态、dp[i][1]:之前就不持有股票并继续保持不持有股票时的最大收益、dp[i][2]:今天才股票,明天将为冷冻期、dp[i][3]:冷冻期。

(2)递推公式:

  1. dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i], dp[i - 1][3] - prices[i]):取三种操作的最大值。第一种,昨天已持有并继续保持。第二种,昨天不持有并且昨天不为冷冻期,今天买入股票。第三种,昨天不持有并且昨天为冷冻期,今天买入。

  2. dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]):取两种操作的最大值。第一种,之前已不持有且昨天不为冷冻期,保持。第二种,之前已不持有并且昨天为冷冻期,从冷冻期转移过来。

  3. dp[i][2] = dp[i - 1][0] + prices[i]:只有一种操作,今天售卖股票。

  4. dp[i][3] = dp[i - 1][2]:昨天刚卖出股票,今天为冷冻期。

(3)dp数组初始化:

dp[0][0] = -prices[0],因为不能当天买当天卖dp[0][1] = dp[0][2] = dp[0][3]为非法变量,为了便于后续计算,由后续的需求可反推知,应把这三个初始化为0。

(4)遍历顺序: 从小到大。

(5)举例:
image.png

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> dp(n + 1, vector<int>(4));
        dp[0][0] = -prices[0];

        for(int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][1] - prices[i], dp[i - 1][3] - prices[i]));
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
            dp[i][2] = dp[i - 1][0] + prices[i];
            dp[i][3] = dp[i - 1][2];
        }

        return max(dp[n - 1][3], max(dp[n - 1][1], dp[n - 1][2]));
    }
};

参考文章:309.最佳买卖股票时机含冷冻期

(2)变量优化

dp数组和递推公式变为3个,分别为:

  1. dp[i][0] = max(dp[i - 1][0], dp[i - 1][2] - prices[i]):持有股票时的最大收益,在之前的就已持有的状态和从非冷冻期后当天买入的状态中,去最大值。

  2. dp[i][1] = dp[i - 1][0] + prices[i]: 今天不持有股票并且明天为冷冻期时,最大收益

  3. dp[i][2] = max(dp[i - 1][2], dp[i - 1][1]):今天不持有股票并且明天不为冷冻期时,最大收益。从之前的就已是此状态和今天才为冷冻期中选一个最大值。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> dp(n + 1, vector<int>(4));
        dp[0][0] = -prices[0];

        for(int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][2] - prices[i]);
            dp[i][1] = dp[i - 1][0] + prices[i];
            dp[i][2] = max(dp[i - 1][2], dp[i - 1][1]);
        }

        return max(dp[n - 1][1], dp[n - 1][2]);
    }
};

参考文章:最佳买卖股票时机含冷冻期

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

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

相关文章

视频直播美颜sdk的发展史

视频直播美颜sdk的出现是必然的&#xff0c;它的诞生就是为了让更多用户能够更好地体验到视频直播带给大家的快乐&#xff0c;可以说视频直播美颜sdk的发展和用户体验有着紧密联系。今天&#xff0c;小编不聊技术&#xff0c;咱们来聊一下视频直播美颜sdk的诞生以及发展历程。 …

抽奖动画大转盘抽奖思路与做法

抽奖是各类营销活动中最常见的一种形式&#xff0c;本产品需求大致如下&#xff1a;转盘周围跑马灯交替闪烁&#xff0c;点击抽奖&#xff0c;大转盘旋转&#xff0c;调用接口获取抽奖结果&#xff0c;大转盘指针指向对应的奖品。高保如下图12.整体思路本需求要求跑马灯交替闪烁…

PHP Composer 下载依赖项时删除其它不相关文件 导致项目报错 依赖包vendor手动导入

场景 最近项目上需要开发图片文字识别功能&#xff0c;接入了开源的tesseract_ocr&#xff0c;根据官网介绍&#xff0c;使用composer require thiagoalessio/tesseract_ocr命令安装依赖&#xff0c;但是在执行之后&#xff0c;删除了一些文件&#xff0c;导致项目报错。 解…

数据管理之特征仓库

鉴于特征仓库热度下降&#xff0c;特将历史库存放出&#x1f604; 背景 数据工程师与算法工程师在数据存取上存在沟通成本&#xff0c;基于现状存在以下问题&#xff1a; 提供训练使用的离线特征与在线服务使用的在线特征&#xff0c;构造方式存在差异&#xff0c;离线、在线…

P18 PyTorch 感知机的梯度推导

前言这里面简单介绍一下单层感知机和多层感知机的模型参考&#xff1a;https://www.bilibili.com/video/BV17e4y1q7NG?p41一 单层感知机模型输入: k 代表网络层数&#xff0c;i 代表输入节点的编号前向传播: 权重系数k: 层数i: 前一层输入节点编号j: 当前层输出节点编号这里&a…

Python opencv进行圆形识别(圆检测)

圆形识别&#xff08;圆检测&#xff09;是图像识别中很常见的一种处理方式&#xff0c;最核心的是cv2.HoughCircles这个函数实现的圆形检测。当然还有一些其他的处理过程&#xff0c;以下详述&#xff1a; 1 读入图像 首先需要读取一个图像文件&#xff0c;将其作为一个变量…

Java 字符串

文章目录一、API二、String1. String 构造方法2. String 对象的特点3. 字符串的比较4. 用户登录案例5. 遍历字符串6. 统计字符次数7. 拼接字符串8. 字符串反转三、StringBuilder1. 构造方法2. 添加及反转方法3. 与 String 相互转换4. 拼接字符串升级版5. 字符串反转升级版一、A…

【Java】Spring核心与设计思想

文章目录Spring核心与设计思想1. Spring是什么1.1 什么是容器1.2 什么是IOC1.2.1 传统程序开发1.2.2 控制反转式程序开发1.2.3 对比总结规律1.3 理解Spring IOC1.4 DI概念说明Spring核心与设计思想 1. Spring是什么 我们通常所说的Spring指的是Spring Framework&#xff08;S…

工业4.0和工业物联网如何协同工作

虽然许多公司已经接受了工业物联网&#xff0c;但他们现在必须接受工业4.0对数据驱动的数字化转型的承诺。随着制造业、能源、公用事业和供应链应用迅速采用工业物联网(IIoT)&#xff0c;这些行业的新现实正在形成。工业物联网提供了企业管理数千个活动部件所需的数据类型&…

二、最基本的vuex的使用

二、最基本的vuex的使用&#xff1a; 学习任何技术&#xff0c;先找到没有用这个技术时&#xff0c;给我们带来了什么麻烦 而这个新技术是怎么帮我们解决这些问题的。 理解方式&#xff1a; state&#xff1a;装数据的一个对象 mutations&#xff1a;装方法的一个对象&#…

FPGA纯Verilog实现任意尺寸图像缩放,串口指令控制切换,贴近真实项目,提供工程源码和技术支持

目录1、前言2、目前主流的FPGA图像缩放方案3、本方案的优越性4、详细设计方案5、vivado工程详解6、上板调试验证并演示7、福利&#xff1a;工程源码获取1、前言 代码使用纯verilog实现&#xff0c;没有任何ip&#xff0c;可在Xilinx、Intel、国产FPGA间任意移植&#xff1b; 图…

steam搬砖信息差项目,新手1周拿到结果!

项目具体是什么呢&#xff1f; 项目简单概括通过选品软件自动分析出此商品国内外商品价格&#xff0c;计算出利润率&#xff0c;选择出有利润销量好的商品&#xff0c;在以最低价格上架到国内buff的平台里&#xff0c;既能快速的卖出&#xff0c;还能获利。 主要利润在于商品…

力扣刷题|216.组合总和 III、17.电话号码的字母组合

文章目录LeetCode 216.组合总和题目链接&#x1f517;思路LeetCode 17.电话号码的字母组合题目链接&#x1f517;思路LeetCode 216.组合总和 题目链接&#x1f517; LeetCode 216.组合总和 思路 本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。 相对于7…

2 月 25 日,论道京城 | 云原生开源项目应用实践报名开启

在数字化转型的浪潮中&#xff0c;云原生已经逐渐成为人们关注的焦点。开源社区作为云原生技术创新的根据地&#xff0c;为云原生的产业发展打造了丰富的技术生态圈&#xff0c;也在广泛的实践中源源不断地创造着新的机遇。想知道云原生存储技术实现了怎样的突破吗&#xff1f;…

51单片机开发环境搭建 - VS Code 从编写到烧录

我安装并测试成功的环境&#xff1a; 操作系统&#xff1a;Windows 10 (22H2)单片机&#xff1a;STC89C52RCPython version: 3.7.6 在这之前&#xff0c;给51单片机写程序是用 Keil 5&#xff08;编写编译&#xff09;、STC-ISP&#xff08;烧录&#xff09;&#xff0c;由于…

第六章.卷积神经网络(CNN)—卷积层(Convolution)池化层(Pooling)

第六章.卷积神经网络(CNN) 6.1 卷积层(Convolution)&池化层(Pooling) 1.整体结构 以5层神经网络的实现为例&#xff1a; 1).基于全连接层(Affine)的网络 全连接层&#xff1a;相邻层的所有神经元之间都有连接 2).常见的CNN的网络 3).全连接层存在的问题 数据的形状容易被…

VSCode Remote-SSH配置免密登录踩坑

VSCode Remote-SSH配置免密登录踩坑1. 参考2. 基本流程2.1 机器A&#xff08;Windows客户端&#xff09;2.2 机器B&#xff08;Linux服务器&#xff09;2.3 机器A&#xff08;Windows客户端&#xff09;的VSCode设置3. 踩坑总结相关教程很多&#xff0c;但要么冗余&#xff0c;…

Teradata退出中国,您可以相信中国数据库!

继Adobe、Tableau、Salesforce之后&#xff0c;2023年2月15日&#xff0c;数仓软件巨头Teradata宣布将逐步结束在中国的直接运营。数仓界的“黄埔军校”仓皇撤出中国市场给出的理由非常含蓄&#xff1a;Teradata对中国当前和未来商业环境的慎重评估&#xff0c;我们做了一个艰难…

阅读笔记5——深度可分离卷积

一、标准卷积 标准卷积在卷积时&#xff0c;同时考虑了特征图的区域和通道信息。 标准卷积的过程如图1-1所示&#xff0c;假设输入特征图的channel3&#xff0c;则每个卷积核的channel都为3&#xff0c;每个卷积核的3个channel对应提取输入特征图的3个channel的特征&#xff08…

抖音怎样报白?报白需要审核哪些资料呢

抖音怎样报白&#xff1f;报白需要审核哪些资料呢 抖音报白需要什么资料&#xff0c;翡翠原石产品如何开通报白#报白#小店报白#小店运营#抖音#抖音小店运营 文/专栏作家百收 随着抖音在国内流行起来&#xff0c;抖音上每天会有大量的视频更新&#xff0c;越来越多的年轻人也加…