C国演义 [第十章]

第十章

  • 最佳买卖股票时机含冷冻期
    • 题目理解
    • 步骤
      • dp数组
      • 递推公式
      • 初始化
      • 遍历方向
    • 代码
  • 买卖股票的最佳时机含手续费
    • 题目理解
    • 步骤
      • dp数组
      • 递推公式
      • 初始化
      • 遍历方向
    • 代码

最佳买卖股票时机含冷冻期

力扣链接

给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)

示例 1:
输入: prices = [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

示例 2:
输入: prices = [1]
输出: 0

  • 提示:
    1 <= prices.length <= 5000
    0 <= prices[i] <= 1000

题目理解

这个题目猛一看, 本质上是 买卖股票的最佳时机II的变种
但是一个区别是: 是否含有冷冻期

卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天) — — 我们需要再卖出股票这一天做出区分
来, 我们来聊一下每一天的状态有哪一些:

  1. 保持持有股票
  2. 不持有股票(从冷冻期这一天分开)
    1.今天卖出股票
    2.冷冻期
    3.保持不持有股票

步骤

dp数组

dp[i][0] — — 保持持有股票状态
dp[i][1] — — 今天卖出股票
dp[i][2] — — 冷冻期
dp[i][3] — — 保持不持有股票状态

递推公式

  • dp[i][0]:
    前一天就是持有股票状态 — — dp[i-1][0]
    前一天是冷冻期, 今天才买入股票 — — dp[i-1][2] + prices[i]
    前一天是保持不持有股票状态, 今天才买入股票 — — dp[i-1][3] + prices[i]

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

  • dp[i][1]:
    就只有一种情况 — — 前一天是持有股票状态 — — dp[i-1][0]

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

  • dp[i][2]:
    因为冷冻期只有一天 — — 前一天才卖出股票 — — dp[i-1][1]

⇒ dp[I][2] = dp[i-1][1]

  • dp[i][3]:
    前一天是保持不持有股票的状态 — — dp[i-1][3]
    前一天是冷冻期 — — dp[i-1][2]

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

初始化

dp[0][0] = -prices[0]
dp[0][1] = 0
dp[0][2] = 0
dp[0][3] = 0

遍历方向

都是由前一天的状态推导到今天的状态
由前到后的遍历顺序

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) 
    {
        int len = prices.size();
        vector<vector<int>> dp(len, vector<int>(5));
        
        dp[0][0] = -prices[0];
        for(int i = 1; i < len; i++)
        {
            dp[i][0] = max(dp[i-1][0], max(dp[i-1][2] - prices[i], dp[i-1][3] - prices[i])); // 持有股票状态
            dp[i][1] = dp[i-1][0] + prices[i]; // 卖出股票
            dp[i][2] = dp[i-1][1]; // 冷冻期
            dp[i][3] = max(dp[i-1][3], dp[i-1][2]); // 卖出股票状态
        }
        
        // 不持有股票 肯定比 持有股票 大
        // 所以, 就只要比较不持有股票的几种情况
        return max(dp[len-1][1], max(dp[len-1][2], dp[len-1][3])); 
    }
};

买卖股票的最佳时机含手续费

力扣链接
给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了

返回获得利润的最大值

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例 1:
输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:8
解释:能够达到的最大利润:
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8

示例 2:
输入:prices = [1,3,7,5,10,3], fee = 3
输出:6

  • 提示:
    1 <= prices.length <= 5 * 104
    1 <= prices[i] < 5 * 104
    0 <= fee < 5 * 104

题目理解

这个题目也是跟 买卖股票的最佳时机II的本质也是一样的
不同的一个点就是 卖出股票需要制服一个手续费fee

步骤

dp数组

dp[i][0] — — 第 i 天不持有股票获取的最大利润
dp[i][1] — — 第 i 天持有股票获取的最大利润

递推公式

根据前面的 持有/非持有 的理解, 那么状态应该怎么转移呢?

dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + price[i] - fee);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - price[i]);

初始化

我们通过递推公式发现: 第 i 天的状态是通过 di i - 1天的状态来推导的
⇒ 开始的时候就是 dp[0][0] 和 dp[0][1]
dp[0][0] — — 第 1 天不持有股票的最大利润 — — 第 1 天的钱包是0 — — dp[0][0] = 0;
dp[0][1] — — 第 1 天持有股票的最大利润 — — 第 1 天钱包是0, 就已经买了商品 — — dp[0][1] = -price[0];

遍历方向

通过递推公式发现: 第 i 天的状态是通过 第 i - 1天的状态来推导的
⇒ 所以, 遍历方向是 从前向后的

代码

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) 
    {
        // dp[i][0] -- -- 不持有股票
        // dp[i][1] -- -- 持有股票
        
        int len = prices.size();
        vector<vector<int>> dp(len, vector<int>(2, 0));
        dp[0][0] = 0, dp[0][1] = -prices[0];
        
        for(int i = 1; i < len; i++)
        {
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]-fee);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i]);
        }
        
        return dp[len-1][0];
    }
};


发呆这事,如果做得好,那就是深沉。人们宁愿去关心一个蹩脚电影演员的吃喝拉撒和鸡毛蒜皮,而不愿了解一个普通人波涛汹涌的内心世界. — — 路遥 <平凡的世界>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python_selenuim获取csdn新星赛道选手所在城市用echarts地图显示

文章目录 ⭐前言⭐selenuim获取新星赛道选手主页&#x1f496; 获取参赛选手主页思路分析&#x1f496; 获取参赛选手ip属地思路分析&#x1f496; echarts可视化展示 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享python_selenuim获取csdn新星赛道选手所在…

js的this绑定规则以及箭头函数

目录 调用位置默认绑定隐式绑定隐式丢失 显式绑定callapplybind new绑定装箱绑定优先级this规则之外忽略显式绑定间接函数引用 箭头函数 调用位置 从字面意思上来理解&#xff0c;this似乎是指向自己的 然而在JavaScript中&#xff0c;this并不是绑定到自身的 可以看这一个例子…

PyTorch翻译官网教程6-AUTOMATIC DIFFERENTIATION WITH TORCH.AUTOGRAD

官网链接 Automatic Differentiation with torch.autograd — PyTorch Tutorials 2.0.1cu117 documentation 使用TORCH.AUTOGRAD 自动微分 当训练神经网络时&#xff0c;最常用的算法是方向传播算法。在该算法中&#xff0c;根据损失函数与给定参数的梯度来调整模型参数&…

Python程序设计基础:列表与元组(二)

文章目录 一、数值列表的生成1、通过input()函数输入创建列表2、通过list()函数转换3、列表生成式4、数值列表的几种统计计算 二、元组1、元组的定义2、元组的操作3、元组作为列表元素 三、转换函数1、元组和列表之间的转换2、字符串和列表之间的转换3、split()方法 一、数值列…

2024考研408-操作系统 第二章-进程与线程 学习笔记

文章目录 前言一、进程1.1、进程的概念、组成与特征1.1.1、进程的概念1.1.2、进程的组成认识PCB认识程序段与数据段&#xff08;包含进程实体概念&#xff09; 1.1.3、进程的特征知识回顾与重要考点 1.2、进程的状态、状态间的转换和组织方式1.2.1、进程的状态进程的五种状态详…

RandLA-Net 复现

GPU3090 CUDA12 1、代码 [github地址] git clone --depth1 https://github.com/QingyongHu/RandLA-Net && cd RandLA-Net 2、虚拟环境中配置&#xff1a; 在跑代码的时候出现错误&#xff1a;open3d.so文件中函数报错。查看open3d版本发现不是要求的0.3版本&#xff…

设计模式 ~ 工厂模式

工厂模式 工厂模式是一种设计模式&#xff0c;指在通过使用工厂函数或构造函数来创建对象&#xff1b; 它提供了一种灵活的方式来创建对象实例&#xff0c;而无需直接调用构造函数或使用new关键字&#xff1b; 可以分类&#xff0c;解耦&#xff1b; 可以扩展多个类&#xff0…

【Spring——Spring的基础与创建】

目录 &#x1f367;1. 什么是 Spring &#xff1f; &#x1fad6;1.1 容器 &#x1f359;1.2 IoC &#x1f97d;1.3 汽车类——传统写法 &#x1f358;1.4 汽车类——IoC 写法 &#x1f32d;2. 配置 maven 国内源 &#x1f32e;2.1 在设置中勾选文件 &#x1f364;2.2 在…

【网站建设】HTTP/HTTPS 是什么?有什么区别?

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff0c;感…

自定义程序包不存在的解决方法

方案一&#xff1a; 在pom文件中加入以下代码 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.4.2</version><configuration><skipTests>true</sk…

openResty的Redis模块踩坑记录

OpenResty提供了操作Redis的模块&#xff0c;我们只要引入该模块就能直接使用。说是这样说&#xff0c;但是实践起来好像并不太顺利。 1.设置了密码的redis&#xff0c;lua业务逻辑中需要添加身份认证代码 网上很多资料、文章似乎都是没有设置redis密码&#xff0c;说来也奇怪…

fileinclude

前提知识&#xff1a; filter伪协议 include函数用php://filter伪协议来绕过 题目&#xff1a; 打开题目 页面显示如图&#xff0c;可以知道flag在flag.php中&#xff0c;还知道当前页面的绝对路径 先查看源代码 15行$lan用$_cookie传参&#xff0c;可以修改cookie值从而控制…

探索非洲专线物流的新时代_国际物流供应链管理平台_箱讯科技

随着全球化的发展&#xff0c;非洲作为一个充满机遇和挑战的大陆&#xff0c;吸引着越来越多的企业和投资者。然而&#xff0c;由于非洲的地理复杂性和基础设施不完善&#xff0c;物流问题一直是制约非洲发展的瓶颈之一。为了解决这一问题&#xff0c;非洲专线物流应运而生。本…

网络原理之传输层与网络层重点协议

目录 传输层重点协议 TCP协议 TCP协议段格式 TCP原理 确认应答机制&#xff08;安全机制&#xff09; 超时重传机制&#xff08;安全机制&#xff09; 连接管理机制&#xff08;安全机制&#xff09; 滑动窗口&#xff08;效率机制&#xff09; 流量控制&#xff08;安…

数字IC笔试面试常考问题及答案汇总(内含各岗位大厂题目)

经历了无数的笔试面试之后&#xff0c;不知道大家有没有发现数字IC的笔试面试还是有很多共通之处和规律可循的。所以一定要掌握笔试面试常考的问题。 数字IC笔试面试常考问题及答案汇总&#xff08;文末可领全部哦~&#xff09; 验证方向&#xff08;部分题目&#xff09; Q1…

数据可视化分析,2023结婚全品类消费趋势洞察报告

结婚消费与人们的关系密切相关。结婚是一个重要的人生事件&#xff0c;往往伴随着大量的消费。人们倾向于在婚礼仪式、婚纱摄影、宴会等方面进行豪华的投资&#xff0c;以展示社会地位和个人品味。此外&#xff0c;结婚还涉及到婚戒、婚庆、蜜月旅行等费用。然而&#xff0c;随…

Jenkins+Robot 接口自动化测试

目录 前言&#xff1a; 设计目标 项目说明 目录结构 配置 jenkins 1.安装插件 2.配置项目 前言&#xff1a; JenkinsRobot是一种常见的接口自动化测试方案&#xff0c;可以实现自动化的接口测试和持续集成。Jenkins是一个流行的持续集成工具&#xff0c;而Robot Framew…

【5G PHY】5G 调制与编码策略(MCS)介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

Cisco学习笔记(CCNA)——Internetworking

Internetworking Internetworking Basics 什么是网络&#xff1f; 计算机网络&#xff1a;具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来 网络设备 Hub&#xff08;集线器&#xff09; 优点&#xff1a;便宜、操作简单 缺点&#xff1a;共享型、…

Kubernetes(K8s)常用命令大全:熟练编排更完美

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…