AcWing算法提高课-1.4.2股票买卖 IV

news2025/2/2 22:40:12

算法提高课整理

CSDN个人主页:更好的阅读体验

Start

原题链接
题目描述

给定一个长度为 n n n 的数组,数组中的第 i i i 个数字表示一个给定股票在第 i i i 天的价格。

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

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

输入格式

第一行包含整数 n , k n,k n,k,表示数组的长度以及你可以完成的最大交易笔数。

第二行包含 n n n 个不超过 1 0 4 10^4 104 的正整数,表示完整的数组。

输出格式

输出一个整数,表示最大利润。

数据范围

1 ≤ N ≤ 1 0 5 1 \le N \le 10^5 1N105,
1 ≤ k ≤ 100 1 \le k \le 100 1k100


思路

本题为 DP 问题,可以使用 闫氏DP分析法 解题。

DP:
  • 状态表示 f i , j , 0 / 1 f_{i,j,0/1} fi,j,0/1
    • 集合:在前 i i i 天中进行买卖,第 i i i 天【持有 ( 1 ) (1) (1) | 不持有 ( 0 ) (0) (0)】股票且已经完成 j j j 笔完整的交易(先卖出后买入)的所有方案的集合。
    • 属性: max ⁡ \max max
  • 状态计算:
    • 本题状态较复杂,如何用 0 / 1 0/1 0/1 表示各种状态转移?
      • 0 → 0 0\rightarrow 0 00 继续不持有股票;
      • 0 → 1 0\rightarrow 1 01 买当天的股票;
      • 1 → 0 1\rightarrow 0 10 卖出手里的股票;
      • 1 → 1 1\rightarrow 1 11 继续持有股票。
    • 解决了状态转移的问题,考虑设计状态转移方程。
    • 观察下图状态机,我们发现:
      • f i , j , 0 f_{i,j,0} fi,j,0 由上一层的两个状态 f i − 1 , j , 0 , f i − 1 , j , 1 f_{i-1,j,0},f_{i-1,j,1} fi1,j,0,fi1,j,1 转移过来,因此状态转移方程为:f[j][0] = max(f[j][0], f[j][1] + w[i]);
      • f i , j , 1 f_{i,j,1} fi,j,1 由上一层的两个状态 f i − 1 , j , 1 , f i − 1 , j − 1 , 0 f_{i-1,j,1},f_{i-1,j-1,0} fi1,j,1,fi1,j1,0 转移过来,因此状态转移方程为:f[j][1] = max(f[j][1], f[j - 1][0] - a[i]);

ztj

  • 初始化

    • 由于有的状态值为负数,对应到实际情况就是亏钱的股票买卖,所以我们即使求最大值也应该将所有状态都初始化为 − ∞ -\infty
    • f[0][0][0] = 0; 什么都没有,当然是 0 0 0 咯~
  • 目标状态: f n , 0 ∼ k , 0 f_{n,0\sim k,0} fn,0k,0(即所有日期都考虑了,买卖次数不超过 k k k 次,最后手里不剩股票的所有状态)。


疑难解答

Q:为什么状态的设计是先卖出再买入呢?题中不是先买入嘛?

A:第一支股票第一次操作只有买或不买,一定不可能是卖或不卖,因此第一支股票买入时必须按照一次交易处理。


算法

时间复杂度 O ( n k ) O(nk) O(nk),空间复杂度 O ( n k ) O(nk) O(nk)

发现空间卡的很紧,容易 MLE。

注意到每次转移全部用的上一层的状态,因此我们考虑滚动数组优化,直接删掉 f f f 数组的第一维,还是正确的。

AC Code

C + + \text{C}++ C++

#include <iostream>
#include <cstring>

using namespace std;

const int N = 100010, M = 110;

int n, m;
int a[N];
int f[M][2]; // 滚动数组

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i ++ )
		scanf("%d", &a[i]);
		
	memset(f, -0x3f, sizeof f);
	f[0][0] = 0; // 初始化
	
	for (int i = 1; i <= n; i ++ )
		for (int j = 1; j <= m; j ++ )
		{
			f[j][0] = max(f[j][0], f[j][1] + a[i]);
			f[j][1] = max(f[j][1], f[j - 1][0] - a[i]);
		}
	
	int res = 0;
	for (int i = 0; i <= m; i ++ )
		res = max(res, f[i][0]);
	
	printf("%d\n", res);
	
	return 0;
}

228aa7bed3e021faf24cf8560d3e47bb.gif

最后,如果觉得对您有帮助的话,点个赞再走吧!

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

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

相关文章

百度网盘资源下载慢解决方法

1、使用百度网盘客户端&#xff0c;设置使用空闲带宽下载 亲测&#xff0c;可以一定程度上解决下载慢的问题&#xff0c;但是对于有些文件下载还是很慢就不清楚为什么了。 2、使用IDM进行下载 &#xff08;1&#xff09;、第一步下载和安装IDM 搜索后&#xff0c;普通下载后安…

JMeter---JSON提取器

JMeter的JSON提取器是一个用于从JSON响应中提取数据的元件。它可以从JSON响应中提取特定字段的值&#xff0c;并将这些值用于后续的测试步骤。 使用JSON提取器的步骤如下&#xff1a; 添加一个HTTP请求&#xff0c;用于获取包含JSON响应的数据。 在HTTP请求之后添加一个JSON提…

【Amazon 实验①】使用 Amazon CloudFront加速Web内容分发

文章目录 实验架构图1. 准备实验环境2. 创建CloudFront分配、配置动、静态资源分发2.1 创建CloudFront分配&#xff0c;添加S3作为静态资源源站2.2 为CloudFront分配添加动态源站 在本实验——使用CloudFront进行全站加速中&#xff0c;将了解与学习Amazon CloudFront服务&…

【Amazon 实验③】验证源请求策略将特定的请求信息转发至源站

文章目录 1. 使用源请求策略1.1 什么是源请求策略1.2 源请求策略和缓存策略的关系 2. 实验&#xff1a;验证源请求策略将特定的请求信息转发至源站 接上一篇文章【Amazon 实验②】使用缓存策略及源请求策略&#xff0c;用于控制边缘缓存的行为及回源行为&#xff0c;本篇文章主…

《每天一分钟学习C语言·七》指针、字节对齐等

1、 对于二维数组如a[3][4]可以当做有三个元素的一维数组&#xff0c;每个元素包含四个小元素。 2、 printf(“%-5d”, i); //负号表示左对齐&#xff0c;5d表示空五个光标的位置 3、 栈&#xff1a;先进后出&#xff0c;堆&#xff1a;先进先出 4、 &#xff08;1&#xff…

机器学习笔记(一)从波士顿房价预测开始,梯度下降

从波士顿房价开始 目标 其实这一章节比较简单&#xff0c;主要是概念&#xff0c;首先在波士顿房价这个问题中&#xff0c;我们假设了一组线性关系&#xff0c;也就是如图所示 我们假定结果房价和这些参数之间有线性关系&#xff0c;即: 然后我们假定这个函数的损失函数为…

罗德与施瓦茨FSV40-N手持式频谱分析仪

描述 R&S FSV是速度最快、功能最全面的信号和频谱分析仪&#xff0c;适用于从事RF系统开发、生产、安装和服务的注重性能、注重成本的用户。 频率范围高达3.6 GHz/7 GHz/13.6 GHz/30 GHz 40 MHz分析带宽 0.4 dB级测量不确定度&#xff0c;最高7 GHz 针对GSM/EDGE、WCDMA/…

面试高频的TCP知识点总结,比我想象得还要详细

下午好&#xff0c;我的网工朋友。 TCP 作为传输层的协议&#xff0c;了解它&#xff0c;拿下它&#xff0c;是一个网络工程师素养的体现&#xff0c;也是面试中经常被问到的知识点。 我们账号之前的文章里也写过不少关于TCP相关的文章&#xff0c;感兴趣的朋友们可以点击下方…

Tekton

一. 概念 Tekton 官网 Github Tekton 是一种用于构建 CI/CD 管道的云原生解决方案&#xff0c;它由提供构建块的 Tekton Pipelines&#xff0c;Tekton 作为 Kubernetes 集群上的扩展安装和运行&#xff0c;包含一组 Kubernetes 自定义资源&#xff0c;这些资源定义了您可以为…

Vue表格中鼠标移入移出input显示隐藏 ,有输入值不再隐藏

Vue表格中鼠标移入移出input显示隐藏 , 不再隐藏的效果 <el-tableref"table":data"tableDatas"borderstyle"width: 100%":span-method"arraySpanMethod"id"table"row-key"id"cell-mouse-enter"editCell&q…

Tarjan-vDCC,点双连通分量,点双连通分量缩点

前言 双连通分量是无向图中的一个概念&#xff0c;它是指无向图中的一个极大子图&#xff0c;根据限制条件可以分为边双连通分量和点双连通分量&#xff0c;欲了解双连通分量需先了解Tarjan算法&#xff0c;以及割点割边的概念及求解。本篇博客介绍点双连通分量的相关内容。 前…

简单了解一下当前火热的大数据 -- Kylin

神兽麒麟 一、Apache Kylin 是什么&#xff1f;二、Kylin架构结语 一、Apache Kylin 是什么&#xff1f; 由eBay公司中国团队研发&#xff0c;是一个免费开源的OLAP多维数据分析引擎优点 超快的响应速度&#xff0c;亚秒级支持超大数据集&#xff08;PB以上&#xff0c;千亿记…

数字人解决方案——ER-NeRF实时对话数字人模型推理部署带UI交互界面

简介 这个是一个使用ER-NeRF来实现实时对话数字人、口播数字人的整体架构&#xff0c;其中包括了大语言回答模型、语音合成、成生视频流、背景替换等功能&#xff0c;项目对显存的要求很高&#xff0c;想要达到实时推理的效果&#xff0c;建议显存在24G以上。 实时对话数字人 …

关于Python里xlwings库对Excel表格的操作(十六)

这篇小笔记主要记录如何【设置单元格数据的对齐方式】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】&#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2&#xff09;如何在Wps下…

MyBatis——MyBatis的延迟加载

MyBatis的延迟加载&#xff08;一对多查询案例&#xff09; 1.什么是延迟加载&#xff1f; 开启延迟加载后&#xff0c;在真正使用数据的时候才发起级联查询&#xff0c;不用的时候不查询。 2.pojo User类&#xff1a; package com.wt.pojo;import java.io.Serializable; …

Rust中peekable的使用

在 Rust 中&#xff0c;从迭代器中获取&#xff08;也就是“消费”&#xff09;一个元素时&#xff0c;每次调用 next 方法都会“消费”迭代器的一个元素&#xff0c;这意味着此元素被从迭代器中移除并返回给调用者&#xff0c; 一旦一个元素被消费&#xff0c;它就不能再次从同…

Python中的//, /, % 运算符详解与区别

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;//, /, % 是常用的数学运算符&#xff0c;用于执行整除、除法和取余操作。本文将深入探讨这三个运算符的作用、用法以及区别&#xff0c;并通过丰富的示例代码帮助大家更好地理解它们的用…

大数据开发职业介绍

........................................................................................................................................................... 大数据开发转正 ...................................................................................…

只更新软件,座椅为何能获得加热功能?——一文读懂OTA

2020年&#xff0c;特斯拉发布过一次OTA更新&#xff0c;车主可以通过这次系统更新获得座椅加热功能。当时&#xff0c;这则新闻震惊了车圈和所有车主&#xff0c;彼时的大家还没有把汽车当作可以“升级”的智能设备。 如今3年过去了&#xff0c;车主对各家车企的OTA升级早已见…

【三维生成与重建】ZeroRF:Zero Pretraining的快速稀疏视图360°重建

系列文章目录 题目&#xff1a;ZeroRF: Fast Sparse View 360◦ Reconstruction with Zero Pretraining 任务&#xff1a;稀疏重建&#xff1b;拓展&#xff1a;Image to 3D、文本到3D 作者&#xff1a;Ruoxi Shi* Xinyue Wei* Cheng Wang Hao Su &#xff0c;来自UC San Dieg…