代码随想录算法训练营Day50 | 123.买卖股票的最佳时机 III、188.买卖股票的最佳时机 IV

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

思路与 121.买卖股票I 一脉相承,一次买卖有2种状态(持有/不持有),那么两次买卖就有4种状态(第一次持有/不持有、第二次持有/不持有)

1、DP数组定义

        dp[i][j]为当前利润,买入则减,卖出则加。j 取值范围[0, 4],分别表示第一次持有,第一次不持有,第二次持有,第二次不持有

        · 持有:今天或前几天完成了买入,当前手头持有股票
        · 不持有:今天或前几天完成了卖出,当前手头不持有股票

2、DP数组初始化:dp[0][0]初始化为-prices[0],其余元素都初始化为最小值,表示还没进行该操作

3、递推公式

        · dp[i][0]:判断当日买入和前几日买入,哪个更便宜,买入的起步资金为0:

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

        · dp[i][1]:在第一次持有的基础上判断是否进行第一次卖出:

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

        · dp[i][2]:第二次买入的起步资金是第一次卖出所得的金额(即dp[i - 1][1]):

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

        · dp[i][1]:在第二次持有的基础上判断是否进行第二次卖出:

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

4、遍历顺序:按时间顺序从前向后遍历

int maxProfit(vector<int>& prices) {// dp[i][j],j为[0, 4],分别表示第一次持有,第一次不持有,第二次持有,第二次不持有// 除了dp[0][0]外其他都初始化为最小值,表示还没进行该操作vector<vector<int>> dp(prices.size(), vector<int>(4, -100001));dp[0][0] = -prices[0];for (int i = 1; i < prices.size(); ++i) {// 第一次买卖操作dp[i][0] = std::max(dp[i - 1][0], -prices[i]);dp[i][1] = std::max(dp[i - 1][1], dp[i - 1][0] + prices[i]);// 第二次买卖操作dp[i][2] = std::max(dp[i - 1][2], dp[i - 1][1] - prices[i]);dp[i][3] = std::max(dp[i - 1][3], dp[i - 1][2] + prices[i]);}// 可以选择 一次买卖都不进行、只进行一次买卖、进行两次买卖return std::max(0, std::max(dp[prices.size() - 1][1], dp[prices.size() - 1][3]));
}

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

和上题几乎完全一致,把2改为k,新增一个遍历k的循环即可

· 第 j 次持有的下标为 2 * j ,第 j 次不持有的下标为 2 * j + 1

· 第 j 次持有需要在第 j - 1 次不持有的基础上进行

· 第 j 次不持有需要在第 j 次持有的基础上进行

int maxProfit(int k, vector<int>& prices) {vector<vector<int>> dp(prices.size(), vector<int>(2 * k, -1001));dp[0][0] = -prices[0];for (int i = 1; i < prices.size(); ++i) {dp[i][0] = std::max(dp[i - 1][0], -prices[i]);dp[i][1] = std::max(dp[i - 1][1], dp[i - 1][0] + prices[i]);for (int j = 1; j < k; ++j) {dp[i][2 * j] = std::max(dp[i - 1][2 * j], dp[i - 1][2 * j - 1] - prices[i]);dp[i][2 * j + 1] = std::max(dp[i - 1][2 * j + 1], dp[i - 1][2 * j] + prices[i]);}}int ans = 0;for (int i = 0; i < k; ++i)ans = std::max(ans, dp[prices.size() - 1][2 * i + 1]);return ans;
}

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

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

相关文章

【Java】Base理论的核心思想和理论三要素

目录 简介 BASE 理论的核心思想 BASE 理论三要素 1. 基本可用 2. 软状态 3. 最终一致性 总结 简介 BASE 是 Basically Available&#xff08;基本可用&#xff09; 、Soft-state&#xff08;软状态&#xff09; 和 Eventually Consistent&#xff08;最终一致性&#xf…

深度强化学习系列【2】- 贝尔曼方程和马尔可夫决策过程

引言: 一直想做点强化学习相关的内容,但是对于其原理一直不是太明了,相比于编程实现,懂得算法部分的机理与理论也是至关重要的。网上找的一些资料都在强调贝尔曼方程和马尔可夫决策过程在强化学习中的作用,但是介绍都不够充分。 另外,在知乎【1】上看到一个说法,说 强化学…

财报解读:基本盘稳定后,联想如何进一步抢占AI时代?

从2021年下半年开始&#xff0c;受诸多因素影响&#xff0c;消费电子行业始终处在承压状态&#xff0c;“不景气”这一关键词屡次被市场提及。 但寒气没有持续&#xff0c;可以看到&#xff0c;消费电子行业正在逐渐回暖。国金证券在今年1月的研报中就指出&#xff0c;从多方面…

【简单模拟】第十一届蓝桥杯省赛第二场C++ B组 / C组《成绩统计》(c++)

1.题目说明 小蓝给学生们组织了一场考试&#xff0c;卷面总分为100 分&#xff0c;每个学生的得分都是一个 0 到 100 的整数。 如果得分至少是 60 分&#xff0c;则称为及格。 如果得分至少为 85 分&#xff0c;则称为优秀。 请计算及格率和优秀率&#xff0c;用百分数表示…

#WEB前端(CCS常用属性,补充span、div)

1.实验&#xff1a; 复合元素、行内元素、块内元素、行内块元素 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; span为行内元素&#xff1a;不可设置宽高&#xff0c;实际占用控件决定分布空间。 div为块内元素&#xff1a;占满整行&#xff0c;可以设置宽高 img为行内块元…

Unity(第二十三部)导航

你可以使用 unity官方提供的 unity导航组件或第三方 unity导航组件&#xff0c;以实现游戏中角色或其他物体的导航。 unity导航组件通常具有多种导航模式&#xff0c;如飞行模式、步行模式、车辆模式等&#xff0c;可以根据不同的需求选择合适的模式。同时&#xff0c;unity导…

2023年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…

2023年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中&#xff0c;敬请期待… 武汉唯众智创科技有限公司 2024 年 2 月 联系人&#xff1a;辜渝傧13037102709 题号&#xff1a;试题01 模块二&#xff1a;数据获取与处理 &#xff08;一&#xff09;…

Ainx的全局配置

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

js中的闭包

理解 函数内部可以访问其外函数中的作用域 作用 创建私有变量延长变量的声明周期一般函数中的变量在函数返回之后就会被销毁,但是闭包会保存使用的变量,即便是上下文被摧毁了,使用的变量依旧存在 闭包的用途 柯里化函数的目的就是在避免重复的调用变量案例 求一个长方形的…

ROS2 Python环境变量PYTHONPATH设置

文章目录 引题解决方法方法一 将三方库与pkg放在一起方法二 将三方库放入pythonpath目录 引题 ROS2在执行ros2 pkg create --build-type ament_python **创建python包时&#xff0c;有时候会涉及外部库的导入&#xff0c;这里讲解一下如何配置PYTHONPATH变量让程序顺利找到外部…

【S32DS报错】-7-程序进入HardFault_Handler,无法正常运行

【S32K3_MCAL从入门到精通】合集&#xff1a; S32K3_MCAL从入门到精通https://blog.csdn.net/qfmzhu/category_12519033.html 问题背景&#xff1a; 在S32DS IDE中使用PEmicro&#xff08;Multilink ACP&#xff0c;Multilink Universal&#xff0c;Multilink FX&#xff09…

【网站项目】182在线作业管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

程序员职业迷宫:选择你的道路,开启技术之旅

在这个数字化飞速发展的时代&#xff0c;程序员已经成为了一个备受瞩目的职业。他们就像是现代社会中的魔法师&#xff0c;用代码搭建起一个又一个令人惊叹的数字世界。然而&#xff0c;对于许多初入行的程序员来说&#xff0c;面对前端的花园、后端的洞穴、数据科学的密室&…

【Python】进阶学习:pandas--describe()函数的使用介绍

&#x1f40d;【Python】进阶学习&#xff1a;pandas——describe()函数的使用介绍 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…

绘图机器 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 绘图机器的绘图笔初始位置在原点&#xff08;0, 0&#xff09;&#xff0c;机器启动后其绘图笔按下面规则绘制直线&#xff1a; 1&#xff09;尝试沿着横向坐标轴…

小程序海报生成海报【vue】

文章目录 1、创建海报的基本逻辑2、用canvas绘制文字3、绘制矩形4、绘制圆形5、绘制圆角矩形6、绘制图片7、执行绘制8、完整的代码 1、创建海报的基本逻辑 1、先创建dom元素 wrapperHeight是根据海报的内容计算出来海报的高度 <view class"preview-card-wrap" ta…

支持向量机 SVM | 线性可分:硬间隔模型公式推导

目录 一. SVM的优越性二. SVM算法推导小节概念 在开始讲述SVM算法之前&#xff0c;我们先来看一段定义&#xff1a; 支持向量机(Support VecorMachine, SVM)本身是一个二元分类算法&#xff0c;支持线性分类和非线性分类的分类应用&#xff0c;同时通过OvR或者OvO的方式可以应用…

长贵对赵本山说:你需要我们家大脚,我立马给你配双大鞋!

长贵对赵本山说&#xff1a;你需要我们家大脚&#xff0c;我立马给你配双大鞋&#xff01; --小品《乡村爱情》&#xff08;中2&#xff09;的台词 表演者&#xff1a;赵本山 于月仙 王小利 唐鉴军等 &#xff08;接上&#xff09; 哈哈哈 伊拉克啊 这地方也不产这玩意吧 …

Chat GPT:AI聊天机器人的革命性突破!

一、引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的发展日新月异&#xff0c;其中最具代表性的成果之一便是Chat GPT。这款基于自然语言处理&#xff08;NLP&#xff09;技术的聊天机器人&#xff0c;以其高度智能、灵活多变的特点&#xff0c;迅速吸引了全…

笔记74:在SLAM建图过程中,为什么要使用【障碍物点云配准算法】和【里程计估算算法】结合的方法

仅使用【障碍物点云配准算法】&#xff0c;很容易导致在一条长通道中&#xff0c;因为前后两帧的雷达点云图过于相似&#xff0c;导致特征匹配一直完全重合&#xff0c;使得机器人建图一直停留在原地&#xff0c;但实体机器人早就沿着通道跑向远端了&#xff1b; 使用Hector_ma…