C++ day50 买卖股票最佳时机

题目1:123 买卖股票的最佳时机Ⅲ

题目链接:买卖股票的最佳时机Ⅲ

对题目的理解

prices[i]表示股票在第i天的价格,最多可以完成两笔交易,不能同时进行多笔交易

可以买卖一次,两次,也可以不买卖

动态规划

动规五部曲

1)dp数组及下标i的含义

dp[i][0]  不操作(可有可无)股票的最大现金

dp[i][1]  第一次持有股票的最大现金

dp[i][2]  第一次不持有股票的最大现金

dp[i][3]  第二次持有股票的最大现金

dp[i][4]   第二次不持有股票的最大现金

不持有股票现金的状态一定比持有股票的现金多,第二次不持有一定包含第一次不持有的钱

最终求解: dp[prices.size()-1][4]

2)递推公式

dp[i][0] = dp[i-1][0]

dp[i][1] = dp[i-1][1]  前一天已经持有

dp[i][1] = dp[i-1][0]-prices[i]   第i天买入,前一天不操作

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

dp[i][2] = dp[i-1][2]  前一天不持有

dp[i][2] = dp[i-1][1]+prices[i]    第i天卖出 前一天持有

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

dp[i][3] = dp[i-1][3]  前一天已经持有

dp[i][3] = dp[i-1][2] -prices[i]  第i天买入,但是因为是第二次买入,所以应该是在第一次卖出的基础上减去第i天的股票价格

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

dp[i][4] = dp[i-1][4]  前一天不持有

dp[i][4] = dp[i-1][3] + prices[i]  第i天卖出,但是因为是第二次卖出,所以应该在第二次买入的基础上加上第i天的股票价格

dp[i][4] = max(dp[i-1][4],dp[i-1][3]+prices[i])

3)dp数组初始化

从递推公式可以看出,i的状态由i-1的状态决定,所以初始化dp[0]

dp[0][0]=0

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

dp[0][2]=0(同一天买卖)

dp[0][3]=-prices[0](第二次又买入了)

dp[0][4]=0(第二次又卖出了)

4)遍历顺序

从递推公式可以看出,i的状态由i-1的状态决定,所以从小到大遍历

for(i=1;i<prices.size();i++)  注意从1开始

5)打印dp数组

代码

class Solution {
public:int maxProfit(vector<int>& prices) {//定义dp数组vector<vector<int>> dp(prices.size(),vector<int>(5));//初始化dp数组dp[0][0] = 0;//不操作dp[0][1] = -prices[0];//第一次持有股票dp[0][2] = 0;//第一次不持有股票dp[0][3] = -prices[0];//第二次持有股票dp[0][4] = 0;//第二次不持有股票for(int i=1;i<prices.size();i++){dp[i][0] = dp[i-1][0];dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i]);dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]);dp[i][3] = max(dp[i-1][3],dp[i-1][2]-prices[i]);dp[i][4] = max(dp[i-1][4],dp[i-1][3]+prices[i]);}return dp[prices.size()-1][4];}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n × 5)

不使用dp[i][0]这个数组,直接将dp[i][0]相关的部分注释掉即可

代码

class Solution {
public:int maxProfit(vector<int>& prices) {//定义dp数组vector<vector<int>> dp(prices.size(),vector<int>(5));//初始化dp数组//  dp[0][0] = 0;//不操作dp[0][1] = -prices[0];//第一次持有股票dp[0][2] = 0;//第一次不持有股票dp[0][3] = -prices[0];//第二次持有股票dp[0][4] = 0;//第二次不持有股票for(int i=1;i<prices.size();i++){// dp[i][0] = dp[i-1][0];dp[i][1] = max(dp[i-1][1],-prices[i]);dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]);dp[i][3] = max(dp[i-1][3],dp[i-1][2]-prices[i]);dp[i][4] = max(dp[i-1][4],dp[i-1][3]+prices[i]);}return dp[prices.size()-1][4];}
};

题目2:买卖股票的最佳时机Ⅳ

题目链接:买卖股票的最佳时机Ⅳ

对题目的理解

prices[i]是某支股票在第i天的价格,最多可以完成k笔交易,不能同时参与多笔交易

动规五部曲

1)dp数组及下标i的含义

dp[i][j]:第i天的状态为j(持有股票奇数,不持有股票偶数)所拥有的最大现金,j大于等于0,小于等于2k

最终求解:dp[prices.size()-1][2k]

2)递推公式

for(j=0;j<2k-1;j+=2)  //j控制第几次买卖

第j次持有  dp[i][j+1] = max(dp[i-1][j+1],dp[i][j]-prices[i]);

第j次不持有  dp[i][j+2] = max(dp[i-1][j+2],dp[i][j+1]+prices[i]);

3)dp数组初始化

根据递推公式,j为奇数,表示持有,for(int j=1;j<2k;j+=2)  dp[0][j]=-prices[0]

4)遍历顺序

根据递推公式,从小到大遍历

5)打印dp数组

代码

class Solution {
public:int maxProfit(int k, vector<int>& prices) {//定义dp数组vector<vector<int>> dp(prices.size(),vector<int>(2*k+1));//初始化dp数组for(int j=1;j<2*k;j+=2){//j为奇数下标时全为-prices[0],j是下标,应不超过2k+1dp[0][j]=-prices[0];} //递推for(int i=1;i<prices.size();i++){for(int j=0;j<2*k-1;j+=2){//将j代入j+2,2k-2+2=2k//持有dp[i][j+1]=max(dp[i-1][j+1],dp[i-1][j]-prices[i]);//不持有dp[i][j+2]=max(dp[i-1][j+2],dp[i-1][j+1]+prices[i]);}}return dp[prices.size()-1][2*k];}
};
  • 时间复杂度: O(n * k),其中 n 为 prices 的长度
  • 空间复杂度: O(n * k)

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

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

相关文章

[字符串操作] 分割乘积

​ 分割乘积 题目描述 给定一个整数&#xff0c;求插入两个乘号将该整数分割成三个数之后&#xff0c;三个数的的最大乘积。 关于输入 只有一行&#xff0c;一个整数。 关于输出 所求出的最大乘积。 例子输入 4242例子输出 336提示信息 整数有正有负&#xff0c;注意&…

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。 流程配置ncnn android yolov5导出自己模型的ncnn修改yolo.py文件导出TorchScript文件pnnx转torchscript为ncnn 安卓运行权重路径输入输出anchors 大小类别名generate_proposals方法修改 结果 流程 网络yolov5 的部署已经有很多了…

最新最全的Postman接口测试: postman实现参数化

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数…

Redis Cluster

概念 Redis Cluster采用多主多从的方式&#xff0c;支持开启多个主节点&#xff0c;每个主节点可以挂载多个从节点。 Cluster会将数据进行分片&#xff0c;将数据分散到多个主节点上&#xff0c;而每个主节点都可以对外提供读写服务。这种做法使得Redis突破了单机内存大小的限制…

2023第二届全国大学生数据分析大赛AB题代码

看大家需求量比较大&#xff0c;所以更新了一下A、B题的示例代码&#xff0c;部分截图如下 A题部分截图 B题部分截图 免费获取代码 关注威信公众号 Python风控模型与数据分析&#xff0c;回复 23年数据分析大赛代码 文末查看如何免费获取代码&#xff1b;编写不易&#xff0c;…

低效的DOM操作(js的问题)

使用 JavaScript 操作DOM&#xff08;即添加、修改和删除元素&#xff09;是相对容易&#xff0c;但操作效率却不怎么样。 比如&#xff0c;每次添加一系列DOM元素。添加一个DOM元素是一个昂贵的操作。连续添加多个DOM元素的代码是低效的。 当需要添加多个DOM元素时&#xff…

【数据结构】AOV网与拓扑排序

一.AOV网的概念&#xff08;Activity On Vertex Network&#xff09; 在一个表示工程的有向图中&#xff0c;用顶点表示活动&#xff0c;用弧表示活动之间的优先关系。这样的有向图为顶点表示活动的网&#xff0c;我们称为AOV网&#xff08;Activity On Vertex Network&#xf…

scikit-learn线性回归法进行利润预测

大家好&#xff0c;生成式人工智能无疑是一个改变游戏规则的技术&#xff0c;但对于大多数商业问题来说&#xff0c;回归和分类等传统的机器学习模型仍然是首选。 私募股权或风险投资这样的投资者利用机器学习&#xff0c;首先必须了解关注的数据以及它是如何被使用的。投资公…

anaconda 笔记:安装anaconda之后显示conda command not found

解决方法是在.bashrc文件中添加如下一行文字&#xff08;如果没有.bashrc文件&#xff0c;就在root中新建一个这个文件&#xff09; export PATH$PATH:/home/Your_name/anaconda3/bin也就是安装anaconda3的路径 然后退出编辑&#xff0c;在命令行中敲入 source ~/.bashrc即可…

云原生Kubernetes系列 | init container初始化容器的作用

云原生Kubernetes系列 | init container初始化容器的作用 kubernetes 1.3版本引入了init container初始化容器特性。主要用于在启动应用容器(app container)前来启动一个或多个初始化容器,作为应用容器的一个基础。只有init container运行正常后,app container才会正常运行…

Spring——IOC,DI,AOP

Spring框架是一个轻量级的Java开发框架&#xff0c;它提供了许多功能强大的特性来简化Java应用程序的开发。其中&#xff0c;IOC&#xff08;控制反转&#xff09;、DI&#xff08;依赖注入&#xff09;和AOP&#xff08;面向切面编程&#xff09;是Spring框架的三大核心特性。…

k8s安装学习环境

目录 环境准备 配置hosts 关闭防火墙 关闭交换分区 调整swappiness参数 关闭setlinux Ipv4转发 时钟同步 安装Docker 配置Yum源 安装 配置 启动 日志 安装k8s 配置Yum源 Master节点 安装 初始化 配置kubectl 部署CNI网络插件 Node节点 检查 环境准备 准…

同步代码,异步代码-微任务 宏任务 事件循环(输出题)

1.知识点 事件循环&#xff1a; 由浏览器Web API管理的异步代码&#xff0c;如果有结果后&#xff0c;会根据这个异步代码的类型&#xff0c;被放入对应的微任务或宏任务当中。当执行栈的任务&#xff08;同步代码&#xff09;全部执行完毕后&#xff0c;再执行完所有微任务的…

springboot(ssm 二手图书交易系统 图书销售系统Java(codeLW)

springboot(ssm 二手图书交易系统 图书销售系统Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#…

Google Guava 缓存工具使用详解

文章目录 缓存工具Cache接口LoadingCache接口CacheBuilder类CacheLoader类CacheStats类RemovalListener类 缓存工具 Guava提供了Cache接口和相关的类来支持缓存功能&#xff0c;它提供了高性能、线程安全的内存缓存&#xff0c;可以用于优化应用程序的性能。 特点&#xff1a…

Flutter 控件查阅清单

为了方便记录和使用Flutter中的各种控件&#xff0c;特写此博客以记之&#xff0c;好记性不如烂笔头嘛&#xff1a;&#xff09; 通过控件的首字母进行查找&#xff0c;本文会持续更新 控件目录 AAppBar BCContainerColumn &#xff08;列&#xff09; DDivider (分割线) EElev…

oj赛氪练习题,

区间内的真素数 import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int M scanner.nextInt();int N scanner.nextInt();scanner.close();ArrayList<Integer>…

Google Guava 散列工具使用详解

文章目录 散列哈希函数哈希码布隆过滤器 散列 Guava 提供了一组散列&#xff08;哈希&#xff09;相关的工具类和方法&#xff0c;包括哈希函数接口、哈希算法实现、哈希码&#xff08;HashCode&#xff09;类、布隆过滤器&#xff08;BloomFilter&#xff09;等等。 Guava 提…

【大连民族大学C语言CG题库练习题】——组合1

【问题描述】 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 【输入形式】 【输出形式】 【样例输入】 4 2 【样例输出】 [2,4] [3,4] [2,3] [1,2] [1,3] [1,4] 【样例说明】 【评分标准】 代码思路&a…

吴恩达《机器学习》11-1-11-2:首先要做什么、误差分析

一、首先要做什么 选择特征向量的关键决策 以垃圾邮件分类器算法为例&#xff0c;首先需要决定如何选择和表达特征向量 &#x1d465;。视频提到的一个示例是构建一个由 100 个最常出现在垃圾邮件中的词构成的列表&#xff0c;根据这些词是否在邮件中出现来创建特征向量&…