裁剪序列Cut the Sequence

news/2025/1/20 22:50:32/文章来源:https://www.cnblogs.com/wlesq/p/18238578

image
首先,我们可以先想一想朴素算法,推出DP,i表示分了几段,则可以推出$$F[i]=min_{1<=j<=i}(f[j]+max_{j+1<=k<=i}(a[k]))$$

点击查看代码
	memset(f,0x3f,sizeof f);f[0]=0;for(int i=1;i<=n;i++){for(int j=0;j<i;j++){int tmp=0;ll sum=0;for(int k=j+1;k<=i;k++){tmp=max<ll>(tmp,a[k]);sum+=a[k];}if(sum<=m)f[i]=min(f[i],f[j]+tmp);}}cout<<f[n];

这是\(O(n^2)\)的算法复杂度,如何优化,我们可以想到用双端队列维护\(a\)数组,以单调递减趋势
用一个变量\(pos\)控制他的左边界别超出\(m\),如何维护最优值呢?
显然\(F[i]\)成一个单调递增趋势,一个区间\(a\)的值越大,他包含的范围应该越大,当max(a[j+1—>i])的值固定,那么j越小越好,当不固定时,可以排除一些情况,即$$j1<j2 a[j1]<=a[j2]是无用的$$
这是我们可以看出用单调队列维护由于f[j]+max(a[j+1—>i])不单调,要用multiset维护一下
与单调队列同步,具体详细看代码
\(F[i]=f[pos-1]+a[q.front()]\)

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define mk make_pair 
#define pb push_back
#define lid (rt<<1)
#define rid (rt<<1|1)
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1e5+5;
ll n,m,a[N],f[N];
multiset <ll> s;
deque <ll> q;
int main()
{speed();cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]>m)return cout<<-1,0;}deque <int> q;int ans=0,pos=1;for(int i=1;i<=n;i++){ans+=a[i];while(ans>m)ans-=a[pos++];	//边界while(q.size()&&q.front()<pos){ll tp=f[q.front()];q.pop_front();//因为单调队列单调递减的缘故,所以front后一个就是maxif(q.size())s.erase(tp+a[q.front()]);//同步}while(q.size()&&a[q.back()]<=a[i]){ll tp=a[q.back()];q.pop_back();if(q.size())s.erase(tp+f[q.back()]);}if(q.size())s.insert(a[i]+f[q.back()]);//队列中每两个相邻元素就得insert一次q.push_back(i);f[i]=f[pos-1]+a[q.front()];//一种可能情况,选择pos->i整个区间,因为该段区间最大值(a[q.front()])与f[k-1]也构成一对可能解if(s.size())f[i]=min<ll>(f[i],*s.begin());}cout<<f[n];return 0;} 

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

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

相关文章

vits-simple-api搭建

根据vits-simple-api中文文档指南自行搭建后端 以下步骤均在windows平台cpu推理搭建为例选择你的vits模型(注意是vits!不是So-Vits Bert Vits2 Gpt Vits)建议去抱脸网搜索或者b站搜素以及自己训练.在vits-simple-api的路径的model目录下新建你下载模型的名字的文件夹将模型的js…

bili-emoji自定义表情包设置

使用图床上传图片.推荐使用聚合图床,简单免费 把图片的图床链接复制到一个txt文件中,如abc.txt 将abc.txt放到koishi目录的非node_modules\koishi-plugin-emojihub-bili文件夹中,如koishi\lumia\abc.txt 在插件界面填写要触发的命令以及路径如下图所示5.使用如下图所示

关于LTspice如何导入第三方的.lib文件进行仿真

转载自:https://bbs.eeworld.com.cn/thread-1265324-1-1.html 1.在芯片官网找到对应的PSPICE模型下载后,将.lib文件移入到路径下的sub文件夹中。(例如C:\Users\\username\Documents\LTspiceXVII\lib\sub) 2.将.lib文件拖入LTspice后右键单击.subckt后的芯片名称,选择Creat S…

OOP题目集4~6的总结

目录(一)前言 (二)作业介绍 (三)算法与代码 (四)PowerDesigner类图模型 (五)SourceMonitor代码分析 (六)自学内容 (七)总结一、前言介绍本篇博客的大致内容、写作目的、意义等本篇博客介绍如何使用Java语言基础和算法来解决题目问题,在此基础上进行对最近Java编…

前端使用 Konva 实现可视化设计器(13)- 折线 - 最优路径应用【思路篇】

这一章把直线连接改为折线连接,沿用原来连接点的关系信息。关于折线的计算,使用的是开源的 AStar 算法进行路径规划,启发方式为 曼哈顿距离,且不允许对角线移动。请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示…

SpringBoot热部署设置

在使用SpringBoot进行开发过程中,我们往往会对代码进行反复修改并对项目进行部署查看效果,这时反复重启SpringBoot会很麻烦,因此使用热部署是提高开发效率的必备插件——“spring-boot-starter-test” <!--SpringBoot热部署依赖--> <dependency> <gr…

redis zset源码

zset底层是由hash字典和跳表实现的,字典存储member->分数的映射关系,这样根据membe查询score的 时间复杂度O为1 跳表可以理解为多个层级的有序链表,每个节点可能在不同层级上,通过在不同层级的跳跃查找,把查询时间复杂度降低到 Olgn 1.随机层数,只有0.25的概率升级层数…

C++U7-08-拓扑排序

拓扑:是指把实体抽象成与其大小形状无关的点,把连接实体的线路抽象成线,研究这些点线之间的相连关系。而表示点和线之间关系的图就被称为拓扑结构图。 拓扑学原本是一个数学概念,描述的是几何图形或空间在连续改变形状后还能保持不变的性质,它只考虑物体间的位置关系而不考…

管式土壤墒情监测仪:引领农业与环境研究的革命性工具

在农业科技日新月异的今天,管式土壤墒情监测仪凭借其独特的优势,已逐步成为农业和环境领域不可或缺的研究装备。这款监测仪,基于先进的介电常数原理,以其卓越的精确度和强大的功能,为研究人员提供了详尽而深入的土壤墒情数据,为探索土壤状况揭开了新篇章。管式土壤墒情监…

本地部署GLM-4-9B清华智谱开源大模型方法和对话效果体验

清华大学和智谱AI推出了全面升级的新一代基座大模型GLM-4,整体性能相比GLM3提升60%,支持128K上下文,可根据用户意图自主理解和规划复杂指令、完成复杂任务……GLM-4-9B是清华大学和智谱AI推出的最新一代预训练模型GLM-4系列中的开源版本。在语义、数学、推理、代码和知识等多…

minos 2.5 中断虚拟化——vGIC

首发公号:Rand_cs这一节开始讲述真正的中断虚拟化,首先来看硬件方面的虚拟化。前文 minos 2.3 中断虚拟化——GICv2 管理 主要讲述 GICv2 的 Distributor 和 CPU Interface,在 Hypervisor 存在的情况下,它们都是为 Hypervisor 服务的。现在有了 vm,vm 里面的内核也需要操作…

minos 2.6 中断虚拟化——虚拟中断子系统

首发公号:Rand_csHypervisor 需要对每个虚机的虚拟中断进行管理,这其中涉及的一系列数据结构和操作就是虚拟中断子系统 VIRQ 虚拟中断描述符 struct vcpu {uint32_t vcpu_id; .........../** member to record the irq list which the* vcpu is handling now*/struct virq_st…