动态规划之买卖股票篇-代码随想录算法训练营第三十八天| 买卖股票的最佳时机ⅠⅡⅢⅣ,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费

121. 买卖股票的最佳时机

题目链接:. - 力扣(LeetCode)

讲解视频:

动态规划之 LeetCode:121.买卖股票的最佳时机1

题目描述:

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

解题思路:

1、状态表示:

0表示买入,1表示卖出

dp[i][0]:第i天结束时,处于「买入」状态,此时的最大利润;

dp[i][1]:第i天结束时,处于「卖出」状态,此时的最大利润;

2、状态转移方程:

因为只能买卖一次,故买入时手中利润为0
dp[i][0] = max(dp[i-1][0],0-prices[i]);
dp[i][1] = max(dp[i-1][1],dp[i-1][0] + prices[i]);

3、初始化:

dp[0][0] = -1*prices[0],dp[0][1] = 0

4、遍历顺序:

按prices从左往右遍历

5、返回值:

返回dp[n-1][1](没有dp[n-1][0]原因是如果当前还存有股票,一定不是最大利润)

 

代码:

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n,vector<int>(2));dp[0][0] = -prices[0];for(int i = 1; i < n; i++){dp[i][0] = max(dp[i-1][0],0-prices[i]);dp[i][1] = max(dp[i-1][1],dp[i-1][0] + prices[i]);}return dp[n-1][1];}
};

122.买卖股票的最佳时机II

题目链接:. - 力扣(LeetCode)

讲解视频:

动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II

题目描述:

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

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

示例 1:

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。
最大总利润为 4 + 3 = 7 。

解题思路:

1、状态表示:

0表示买入,1表示卖出
dp[i][0]:第i天结束时,处于「买入」状态,此时的最大利润;

dp[i][1]:第i天结束时,处于「卖出」状态,此时的最大利润;

2、状态转移方程:

可以买卖无数次,故买入时手中利润为dp[i-1][1]
dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]);//就此处与上一题不一样
dp[i][1] = max(dp[i-1][1],dp[i-1][0] + prices[i]);

3、初始化:

dp[0][0] = -1*prices[0],dp[0][1] = 0

4、遍历顺序:

按prices从左往右遍历

5、返回值:

返回dp[n-1][1](没有dp[n-1][0]原因是如果当前还存有股票,一定不是最大利润)

代码:

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n,vector<int>(2));dp[0][0] = -1 * prices[0];for(int i = 1; i < n; i++){dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]);dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]);}return dp[n-1][1];}
};

123.买卖股票的最佳时机III

题目链接:. - 力扣(LeetCode)

讲解视频:

动态规划,股票至多买卖两次,怎么求? | LeetCode:123.买卖股票最佳时机III

题目描述:

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入:prices = [3,3,5,0,0,3,1,4]
输出:6
解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。

解题思路:

1、状态表示:

f[i][j] 表示:第 i 天结束后,完成了 j 次交易,处于「买入」状态,此时的最大利润;
g[i][j] 表示:第 i 天结束后,完成了 j 次交易,处于「卖出」状态,此时的最大利润。

2、状态转移方程:

对于 f[i][j] ,我们有两种情况到这个状态:

  1. 在 i - 1 天的时候,交易了 j 次,处于「买入」状态,第 i 天啥也不干即可。此时最大利润为: f[i - 1][j] ;
  2. 在 i - 1 天的时候,交易了 j 次,处于「卖出」状态,第 i 天的时候把股票买了。此时的最大利润为: g[i - 1][j] - prices[i] 。

综上,我们要的是「最大利润」,因此是两者的最大值:

f[i][j] = max(f[i - 1][j],g[i - 1][j] - prices[i]) 。


对于 g[i][j] ,我们也有两种情况可以到达这个状态:

  1. 在 i - 1 天的时候,交易了 j 次,处于「卖出」状态,第 i 天啥也不干即可。此时的最大利润为: g[i - 1][j] ;
  2. 在 i - 1 天的时候,交易了 j - 1 次,处于「买入」状态,第 i 天把股票卖了,然后就完成了 j 比交易。此时的最大利润为: f[i - 1][j - 1] + prices[i] 。但是这个状态不一定存在,要先判断一下。

综上,我们要的是最大利润,因此状态转移方程为:
g[i][j] = g[i - 1][j];
if(j >= 1) g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);
 

3、初始化:

f[0][0] = - prices[0] 。

f[0][k](k>=1)为不存在状态,为了取 max 的时候,这些状态「起不到干扰」的作用,我们统统将它们初始化为 -INF (用 INT_MIN 在计算过程中会有「溢出」的风险,这里 INF 折半取0x3f3f3f3f ,足够小即可)

4、遍历顺序:

从「上往下填」每一行,每一行「从左往右」,两个表「一起填」。

5、返回值:

返回处于「卖出状态」的最大值,但是我们也「不知道是交易了几次」,因此返回 g 表最后一行的最大值。

代码:

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> f(n,vector<int>(3));auto g = f;f[0][0] = -1 * prices[0];for(int j = 1; j < 3; j++)f[0][j] = g[0][j] = -1 * 0x3f3f3f3f;for(int i = 1; i < n ; i++){for(int j = 0; j < 3; j++){f[i][j] = max(f[i-1][j], g[i-1][j] - prices[i]);g[i][j] = g[i-1][j];if(j >= 1) g[i][j] = max(g[i][j],f[i-1][j-1]+prices[i]);}}int result = 0;for(int i = 0; i < 3; i++)result = max(g[n-1][i],result);return result;}
};

188.买卖股票的最佳时机IV

题目链接:. - 力扣(LeetCode)

讲解视频:

动态规划来决定最佳时机,至多可以买卖K次!| LeetCode:188.买卖股票最佳时机4

题目描述:

给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入:k = 2, prices = [2,4,1]
输出:2
解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。

解题思路:

在上一题的基础上将交易2次改为交易k次,需要注意会存在交易不符合实际情况--交易次数k大于总天数的一半(2天为一次交易周期),需要预处理k值

代码:

class Solution {
public:int maxProfit(int k, vector<int>& prices) {const int INF = -1 * 0x3f3f3f3f;int n = prices.size();k = min(k,n/2);vector<vector<int>> f(n,vector<int>(k+1,INF));auto g = f;f[0][0] = -1 * prices[0];g[0][0] = 0;for(int i = 1; i < n; i++){for(int j = 0; j <= k; j++){f[i][j] = max(f[i-1][j],g[i-1][j]-prices[i]);g[i][j] = g[i-1][j];if(j >= 1) g[i][j] = max(g[i][j], f[i-1][j-1]+prices[i]);}}int result = 0;for(int i = 0; i <= k; i++)result = max(result,g[n-1][i]);return result;}
};

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

题目链接:. - 力扣(LeetCode)

讲解视频:

动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期

题目描述:

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

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

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

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

解题思路:

1、状态表示:

有「买入」「可交易」「冷冻期」三个状态。

选择用三个数组:

dp[i][0] 表示:第 i 天结束后,处于「买入」状态,此时的最大利润;

dp[i][1] 表示:第 i 天结束后,处于「冷冻期」状态,此时的最大利润;
dp[i][2] 表示:第 i 天结束后,处于「可交易」状态,此时的最大利润。

2、状态转移方程:

谨记规则:

1)处于「买入」状态的时候,我们现在有股票,此时不能买股票,只能继续持有股票,或者卖出股票;

2)处于「卖出」状态的时候:

  • 如果「在冷冻期」,不能买入;
  • 如果「不在冷冻期」,才能买入。

根据如下状态图可以得到状态表示:

 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][1],dp[i-1][2]);//可交易

3、初始化:

三种状态都会用到前一个位置的值,因此需要初始化每一行的第一个位置:
dp[0][0] :此时要想处于「买入」状态,必须把第一天的股票买了,因此 dp[0][0] = -1*
prices[0] ;
dp[0][1] :手上没有股票,买一下卖一下就处于冷冻期,此时收益为 0 ,因此dp[0][2]= 0 ;
dp[0][2] :啥也不用干即可,因此 dp[0][1] = 0 。

4、遍历顺序:

根据「状态表示」,我们要三个表一起填,每一个表「从左往右」。

5、返回值:

应该返回「卖出状态」下的最大值,因此应该返回max(dp[n-1][1],dp[n-1][2])。

 代码:

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n,vector<int>(3));dp[0][0] = -1 * 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][1],dp[i-1][2]);//可交易}return max(dp[n-1][1],dp[n-1][2]);}
};

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

题目链接:. - 力扣(LeetCode)

讲解视频:

动态规划来决定最佳时机,这次含手续费!| LeetCode:714.买卖股票的最佳时机含手续费

题目描述:

给定一个整数数组 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

解题思路:

在122.买卖股票的最佳时机Ⅱ基础上每次交易时减去fee手续费即可

代码:

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();vector<vector<int>> dp(n,vector<int>(2));dp[0][0] = -1 * prices[0];for(int i = 1; i < n; i ++){dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]);dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);}return dp[n-1][1];}
};

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

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

相关文章

[数据集][目标检测]电力场景输电线异物检测数据集VOC+YOLO格式2060张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2060 标注数量(xml文件个数)&#xff1a;2060 标注数量(txt文件个数)&#xff1a;2060 标注…

K8s节点状态 NotReady排查

k8s节点由 Ready变成 NotReady izbp12ghzy6koox6fqt0suz NotReady slave 97d v1.23.3 izbp12ghzy6koox6fqt0svz Ready control-plane,master 98d v1.23.3节点进入 NotReady 状态可能是由于多种原因引起的&#xff0c;尤其是在资源过量分配&am…

环绕音效是什么意思,电脑环绕音效怎么开

Boom 3D是一款专业的音效增强软件&#xff0c;它拥有先进的音效处理技术和丰富的音效设置选项&#xff0c;可以为用户打造出高度定制化的音频体验&#xff0c;Boom 3D还拥有简洁直观的界面&#xff0c;操作简单易懂&#xff0c;即使是音频技术的新手也能轻松上手。本篇文章就将…

微信小程序引入全局环境变量

有时候一套代码要在多个小程序appId下使用,其中又有一些数据(文字)需要做区分.可以使用下面的方法 把要配置的数据以export default 形式导出 在app.js中,引入project.config.0.js文件,将导出的数据放在globalData中 在页面目录中,即可利用getApp()方法使用全局变量 也可以放数…

buuctf [HDCTF2019]Maze

前言&#xff1a;做题笔记。 常规 下载 解压 查壳 脱壳后用32IDA Pro打开。 得&#xff0c;迷宫类型的题目。(字符串有说。) 咳&#xff0c;此前思路对半分不行了。。。 合理猜测步数为&#xff1a;14。 那可以看看7 * 10的迷宫类型。(手动猜测的时候去取倍数如&#xff1a;0 2…

【三维深度补全模型】PENet

【版权声明】本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 参考书籍&#xff1a;《人工智能点云处理及深度学习算法》 本文为专栏《Python三维点云实战宝典》系列文章&#xff0c;专栏介绍地址“【python三维深度学习】python…

shell脚本中$0 $1 $# $@ $* $? $$ 的各种符号意义详解

文章目录 一、概述1.1、普通字符1.2、元字符 二、转义字符$2.1、实例12.2、实例22.3、实例32.4、实例42.5、实例5 三、linux命令执行返回值$?说明 一、概述 shell中有两类字符&#xff1a;普通字符、元字符。 1.1、普通字符 在Shell中除了本身的字面意思外没有其他特殊意义…

校友林小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;树木管理管理&#xff0c;所属科管理&#xff0c;树木领取管理&#xff0c;树跟踪状态管理&#xff0c;用户信息统计管理&#xff0c;树木捐款管理&#xff0c;留言板管理 微信端…

基于vue框架的毕业设计管理系统5n36i(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,教师,课题信息,题目分类,选题信息,任务书,中期检查,提交论文,论文成绩,答辩成绩,校园公告,教研主任,申报课题 开题报告内容 基于Vue框架的毕业设计管理系统开题报告 一、引言 随着高等教育的不断发展&#xff0c;毕业设计作为培…

AITDK SEO扩展:为网站优化提供一站式解决方案

AITDK SEO扩展&#xff1a;为网站优化提供一站式解决方案 想提升你的网站在搜索引擎中的排名&#xff1f;让我们来看看AITDK SEO扩展&#xff0c;它是你网站优化的得力助手&#xff01;在这篇文章中&#xff0c;我将为你介绍AITDK SEO扩展的功能特点&#xff0c;以及它如何帮助…

警惕!低血糖来袭,这些“隐形信号”你中招了吗?

在这个快节奏的时代&#xff0c;我们往往忙于工作、学习与生活&#xff0c;却容易忽视身体发出的微妙警告。其中&#xff0c;低血糖作为一种常见但易被忽视的健康问题&#xff0c;正悄悄影响着许多人的生活质量。今天&#xff0c;就让我们一起揭开低血糖的神秘面纱&#xff0c;…

Java:包装类

文章目录 引入原因包装类代码演示包装类的其他常见操作 使用到的有关ArrayList的方法 引入原因 泛型和集合不支持基本数据类型&#xff0c;只能支持引用数据类型 包装类 包装类就是把基本类型的数据包装成对象 就是说不再是一个int类型的数&#xff0c;而是一个Integer类型的…

Stable Diffusion 使用详解(8)--- layer diffsuion

背景 layer diffusion 重点在 layer&#xff0c;顾名思义&#xff0c;就是分图层的概念&#xff0c;用过ps 的朋友再熟悉不过了。没使用过的&#xff0c;也没关系&#xff0c;其实很简单&#xff0c;本质就是各图层自身的编辑不会影响其他图层&#xff0c;这好比OS中运行了很多…

文件树控件开发

文件树控件和获取驱动信息功能 然后添加上查看文件信息的按钮 双击这个按钮添加上如下代码 void CRemoteClientDlg::OnBnClickedBtnFileinfo() {int ret SendCommandPacket(1);if (ret -1) {AfxMessageBox(_T("命令处理失败!!!"));return;}ClientSocket* pClient…

AI大模型独角兽 MiniMax 基于 Apache Doris 升级日志系统,PB 数据秒级查询响应

作者&#xff1a;MiniMax 基础架构研发工程师 Koyomi、香克斯、Tinker 导读&#xff1a;早期 MiniMax 基于 Grafana Loki 构建了日志系统&#xff0c;在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案&#xff0c;并基于 Apache …

Ubuntu 22安装和配置PyCharm详细教程(图文详解)

摘要&#xff1a;本文提供了在 Ubuntu 22 上通过官方 .tar.gz 文件安装 PyCharm 的详细教程。包括从 JetBrains 官方网站下载适合的 PyCharm 版本&#xff08;Community 或 Professional&#xff09;&#xff0c;在终端中解压并将其移动到 /opt 目录&#xff0c;配置适当的权限…

【C++题解】1147. 求1/1+1/2+2/3+3/5+5/8+8/13+13/21……的前n项的和

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1147. 求1/11/22/33/55/88/1313/21……的前n项的和 类型&#xff1a;函数 题目描述&#xff1a; 求1/11/22/33/55/88/1313/2121/34…的前 n 项的和。 输入&#xff1a; 输入一个…

Unity读取Android本地图片

unity读取Android本地图片 一、安卓读取路径 安卓路径&#xff1a;“file:///storage/emulated/0/”自己图片的路径 例&#xff1a;“file:///storage/emulated/0/small.jpg” 二、unity搭建 使用UI简单搭个界面 三、新建一个脚本 代码内容如下 using System.Collectio…

谷粒商城实战笔记-251-商城业务-消息队列-Exchange类型

文章目录 一&#xff0c;Exchange二&#xff0c;Exchange的四种类型1&#xff0c;direct2&#xff0c;fanout3&#xff0c;topic 三&#xff0c;实操1&#xff0c;创建一个exchange2&#xff0c;创建一个queue3&#xff0c;将queue绑定到exchange 一&#xff0c;Exchange AMQP …

本地部署docker文档

由于访问 https://docs.docker.com/ 文档慢&#xff0c;直接本地部署官方文档 如果不想执行以下操作&#xff0c;也可以直接使用官方文档仓库地址提供的 Dockerfile 和 compose.yaml 进行操作 以下操作环境为Windows系统&#xff0c;根据 Dockerfile 相关操作来生成 html 页面…