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

买卖股票的最佳时机III

Alt
最多只能完成两笔交易,那么对于每一天的股票可以有5种状态:

  1. 没有操作
  2. 第一次持有股票
  3. 第一次不持有股票
  4. 第二次持有股票
  5. 第二次不持有股票

所以设计的 dp 数组应该有5个维度,分别计算可能得到的最大利润。对于如何递推,是类似于昨天的股票问题的。
对于初始化dp数组,第一次持有与不持有与之前都是一样的,dp[0][1] = -prices[0]、dp[0][2] = 0。第二次持有与不持有在第0天可以看做第一次持有又在当天卖出,这样就出现了第二次的持有与不持有,此时dp[0][3] = -prices[i]、dp[0][4] = 0
最终应该返回什么作为最大利润呢?应该返回 dp[i][4]。这个值其实包括了只交易一笔 dp[i][2] 的情况(相当于当天买当天卖完成第二次的持有)。

class Solution{
public:
	int maxProfit(vector<int>& prices) {
		int n = prices.size();
		vector<vector<int>> dp(n, vector<int>(5, 0));
		dp[0][1] = -prices[0];
		dp[0][3] = -prices[0];
		for(int i = 1; i < n; i++) {
			dp[i][0] = dp[i - 1][0];  // 其实没有操作这一状态也可以不考虑,因为不会改变始终是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[n - 1][4];
 	}
};

买卖股票的最佳时机IV

Alt
这道题就是上一道题的外推。最多两笔交易时有5种状态,最多k笔交易则应该有 2*k+1 种状态。

class Solution {
public:
	int maxProfit(int k, vector<int>& prices) {
		int len = prices.size();
		vector<vector<int>> dp(len, vector<int>(2 * k + 1, 0));
		for(int j = 1; j < 2 * k; j += 2) {
			dp[0][j] = -prices[0];  // 奇数下标是持股状态,所以应该是-prices[0]
		}
		for(int i = 1; i < len; i++) {
			for(int j = 0; j < 2 * k - 1; j += 2) {
				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[len - 1][2 * k];
	}
};

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

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

相关文章

leetcode(算法) 70.爬楼梯(python版)

需求 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例 2&#xff1…

Vue的个人笔记

Vue学习小tips ctrl s ----> 运行 alt b <scrip> 链接 <script src"https://cdn.jsdelivr.net/npm/vue2.7.16/dist/vue.js"></script> 插值表达式 指令

学习对象原型中的hasOwnProperty()

hasOwnProperty(propertyName)方法 是用来检测属性是否为对象的自有属性&#xff0c;如果是&#xff0c;返回true&#xff0c;否者false; 参数propertyName指要检测的属性名&#xff1b;

【白嫖8k买的机构vip教程】Jmeter_性能测试(2):性能测试的流程和术语

性能测试的流程 一、准备工作 1、系统基础功能验证 一般情况下&#xff0c;只有在系统基础功能测试验证完成、系统趋于稳定的情况下&#xff0c;才会进行性能测试&#xff0c;否则性能测试是无意义的。2、测试团队组建 根据该项目的具体情况&#xff0c;组建一个几人的性能测试…

【软考问题】-- 10 - 知识精讲 - 项目风险管理

一、基本问题 1&#xff1a;按照可预测性&#xff0c;风险分哪三类&#xff1f; &#xff08;1&#xff09;已知风险&#xff1a;如项目目标不明确&#xff0c; 过分乐观的进度计划&#xff0c; 设计或施工变更和材料价格波动等。&#xff08;2&#xff09;可预测风险&#xff…

unity学习(20)——客户端与服务器合力完成注册功能(2)调试注册逻辑

接着上一节的问题&#xff0c;想办法升级成具备数据库功能的服务器&#xff0c;这个是必须的。 至少在初始化要学会把文件转换为session&#xff0c;新知识&#xff0c;有挑战的。 现在是从LoginHandler.cs跳到了AccountBiz.cs的create&#xff0c;跳度还是很大的。 create函…

ChromeDriver | 谷歌浏览器驱动下载地址 及 浏览器版本禁止更新

在使用selenoum时&#xff0c;需要chrome浏览器的版本和chrome浏览器驱动的版本一致匹配&#xff0c;才能进行自动化测试 一、ChromeDriver驱动镜像网址 国内可以搜到的谷歌浏览器下载地址里面最新的驱动器只有114版本的CNPM Binaries Mirror 在其他博主那找到了最新版本12X的…

K8s进阶之路-核心概念/架构:

架构&#xff1a;Master/Node Master组件--主控节点{ 负责集群管理&#xff08;接收用户事件转化成任务分散到node节点上&#xff09;} Apiserver&#xff1a; 资源操作的唯一入口&#xff0c;提供认证、授权、API注册和发现等机制 Scheduler &#xff1a; 负责集群资源调度&am…

Springboot AOP开发

Springboot AOP开发 一 AOP概述 AOP&#xff0c;即面向切面编程&#xff0c;简言之&#xff0c;面向方法编程。 针对方法&#xff0c;在方法的执行前或执行后使用&#xff0c;用于增强方法&#xff0c;或拓展。 二 AOP开发 1.引入 spring-boot-starter-aop 在SpringBoot项…

嵌入式学习-C++Day7QT Day1

思维导图 作业&#xff1a;窗口的一些操作的实现 #include "mywidget.h"Mywidget::Mywidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("QQ");this->setWindowIcon(QIcon("C:\\Users\\xuyan\\Desktop\\others\\1.jpg"));…

Linux 内存top命令详解

通过top命令可以监控当前机器的内存实时使用情况&#xff0c;该命令的参数解释如下&#xff1a; 第一行 15:30:14 —— 当前系统时间 up 1167 days, 5:02 —— 系统已经运行的时长&#xff0c;格式为时:分 1 users ——当前有1个用户登录系统 load average: 0.00, 0.01, 0.05…

微信小程序swiper 视频中间大,两边小,轮播滑到中间视频自动播放组件教程

静态效果&#xff1a; 进入下面小程序可以体验效果&#xff0c;点击底部 看剧 栏目 一、创建小程序组件 二、代码 1、WXML <view class"swiper-wrapper" style"background-image:url(/asset/image/hot-banner.jpg);background-size: 100% 100%;">…

JS逆向---RSA登录模拟实例()

文章目录 前言一. 实战分析 前言 该文章是结合前一篇&#xff0c;测试例子是匀加速商城&#xff0c;登录状态下对其密码加密的逆向&#xff0c;比较简单容易上手&#xff0c;作为练习项目 声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不…

C++Qt——信号与槽

Qt信号与槽——建立信号与槽 平常我们所见到的界面&#xff0c;鼠标点击一下指定的按钮&#xff0c;就会产生一定的效果。C Qt框架中的信号与槽机制是Qt进行对象间通信的一种方法&#xff0c;非常核心且有别于传统的回调函数或者消息传递机制。通过信号与槽&#xff0c;Qt能够…

迈向AI时代:掌握Python编程与ChatGPT的强强联手

文章目录 一、ChatGPT与Python编程的结合二、利用ChatGPT学习Python编程的优势三、如何使用ChatGPT学习Python编程四、学习技巧与建议《码上行动&#xff1a;用ChatGPT学会Python编程》特色内容简介作者简介目录获取方式 随着人工智能技术的飞速发展&#xff0c;编程已经成为了…

MySQL学习记录——십일 索引

文章目录 1、了解索引2、聚簇、非聚簇索引3、操作1、主键索引2、唯一键索引3、普通索引4、注意事项 4、全文索引 1、了解索引 MySQL服务器是在内存中的&#xff0c;所有数据库的CURD操作都是在内存中进行&#xff0c;索引也是如此。索引是用来提高性能的&#xff0c;它通过组织…

[ai笔记10] 关于sora火爆的反思

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵重学ai以及成长思考的第10篇分享&#xff01; 最近sora还持续在技术圈、博客、抖音发酵&#xff0c;许多人都在纷纷发表对它的看法&#xff0c;这是一个既让人惊喜也感到焦虑的事件。openai从2023年开始&#xff0c;每隔几个…

【软考问题】-- 14 - 知识精讲 - 项目配置与变更管理

一、基本问题 问题1&#xff1a;什么是配置项&#xff1f; 定义&#xff1a;为配置管理设计的硬件、 软件或二者的集合&#xff0c; 在配置管理过程中作为一个单个实体来对待。分类&#xff1a;软件、硬件和各种文档。问题2&#xff1a;配置库分为哪三类&#xff1f; &#xff…

如何用 Moodle 和 ONLYOFFICE 创建在线学习平台

在教学过程中使用现代在线学习软件&#xff0c;已不再是什么稀奇事。在世界各地&#xff0c;越来越多的教师和学生都在使用现代技术&#xff0c;应用新的学习场景&#xff0c;包括学生在传统课堂之外更积极的参与、更密切的互动。 Moodle 支持各类学校和大学充分利用在线教育过…

单片机和RTOS

一.单片机和RTOS区别 单片机是一种集成了处理器、内存、输入输出接口和外围设备控制器等功能的微型计算机系统。它通常用于控制简单的嵌入式系统&#xff0c;如家电、汽车电子、工业控制等。单片机具有低功耗、低成本和高可靠性等特点。 而RTOS&#xff08;Real-Time Operati…