斜率优化dp复习笔记

news/2025/10/5 10:45:52/文章来源:https://www.cnblogs.com/high-sky/p/19126359

P3648 [APIO2014] 序列分割

将序列分割成 \(k+1\) 个部分,每个部分的元素 \(\geq 1\),然后假设一个块你要分成两个块,代价为分成后两个块里面的元素和的乘积,问你怎么才能使代价最大,并输出方案(SPJ)。

题目分析

注意到顺序是无关紧要的:

若一个块 \(sum\) 要从 \(i,j\) 这里下手(分成三段的和 \(a,b,c\)),顺序所导致的有:

  • 先从 \(i\) 砍,代价为 \(a(b+c)+bc=ab+ac+bc\)
  • 先从 \(j\) 砍,代价为 \((a+b)c+ab=ab+ac+bc\)

两者相等,顺序无用。

故设 \(f_{i,j}\) 表示前 \(i\) 个部分切 \(j\) 次,那么有:

\[f_{i,j}=\max_{l\in[0,i-1]} f_{l,j-1}+sum_l\times(sum_i-sum_l) \]

顺序无关,所以我先在 \(i\) 切,然后再切前面的。

考虑斜率优化,对于 \(j<l\)\(j\)\(l\) 更优,并设 \(f_{x,j-1}=f_x\)

有:

\[f_j+sum_isum_j-sum_j^2>f_l+sum_isum_l-sum_l^2 \Rightarrow \frac{(f_j-sum_j^2)-(sum_l-sum_l^2)}{-sum_j-(-sum_l)}>sum_i \]

那么点集就是 \((-sum_x,f_x-sum_x^2)\)

那么对于当前点 \(i\),所有斜率 \(\leq sum_i\) 的都不可行。

然后队头就是最优决策点,为什么呢?因为对于 \(j<l\) 满足即可,显然是第一个。

也就是直接去维护斜率递增。

现在要把 \(i\) 也添加进来。那么我们维护斜率递增即可。

代码

时间复杂度 \(\mathcal{O}(nk)\),代码如下:

#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cstring>
#include <stdlib.h>
#include <vector>
#include <deque>
#define int long long
#define N 100005
#define K 205
using namespace std;
int pre[N][K],a[N],sum[N],f[N],g[N];
int x(int id) {return -sum[id];}
int y(int id) {return g[id] - sum[id] * sum[id];}
double slope(int fir,int sec) {if (x(fir) == x(sec)) return -1e18;return 1.0 * (y(fir) - y(sec)) / (1.0 * (x(fir) - x(sec)));
}
int q[N],head,tail;
signed main(){int n,k;cin >> n >> k;// k ++;for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]),sum[i] = sum[i - 1] + a[i];// for (int i = 0;i <= n;i ++)//     for (int j = 0;j <= n;j ++) f[i][j] = -1e18;// f[0][0] = 0;// for (int i = 1;i <= n;i ++)//     for (int j = 1;j <= min(i,k);j ++)//         for (int t = 0;t < i;t ++)//             if (f[t][j - 1] + sum[t] * (sum[i] - sum[t]) > f[i][j])//                 f[i][j] = f[t][j - 1] + sum[t] * (sum[i] - sum[t]),pre[i][j] = t;// printf("%lld\n",f[n][k]);// int now = n;// for (int j = k;j > 1;j --) printf("%lld ",pre[now][j]),now = pre[now][j];for (int t = 1;t <= k;t ++) {for (int i = 1;i <= n;i ++) g[i] = f[i];tail = 0;head = 1;// q[++tail] = 0;for (int i = 1;i <= n;i ++) {while(tail > head && slope(q[head],q[head + 1]) <= sum[i]) head ++;f[i] = 0;if (head <= tail) {pre[i][t] = q[head];f[i] = g[q[head]] + sum[q[head]] * (sum[i] - sum[q[head]]);}while(tail > head && slope(q[tail - 1],q[tail]) >= slope(q[tail],i)) tail --;q[++tail] = i;}}printf("%lld\n",f[n]);int now = n;for (int j = k;j >= 1;j --) printf("%lld ",pre[now][j]),now = pre[now][j];return 0;
}

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

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

相关文章

掌握形式验证,护航芯片安全

在 IC 设计的世界里,任何一个微小错误都可能引发重大后果。形式验证(Formal Verification),以其数学证明的方式,成为确保设计可靠性与安全性的强大盾牌。 核心基础与优势解析 1、精准规范,明确预期行为 一切始于…

STL-list - 实践

STL-list - 实践2025-10-05 10:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

2025橡胶软接头厂家最新企业品牌推荐排行榜,法兰橡胶软接头,可曲挠,挠性,KXT,耐油,EPDM,耐腐蚀,三元乙丙橡胶软接头,橡胶柔性软接头公司推荐!

在橡胶软接头行业,质量管控与服务体系的缺失已成为制约产业升级的关键瓶颈。具体表现为: 产品质量两极分化:部分企业为压缩成本,违规采用再生胶、回收料等劣质原料,导致产品出现密封性失效、老化周期缩短等问题,…

整体二分笔记

整体二分 本来感觉挺神秘的一个东西, 学完了似乎没有多难, 放几个板子随便写写吧(今天数学不想做题) 从最最最最人尽皆知的区间第 \(k\) 大问题开始吧 引入 如果我想问你一个序列中的区间的第 \(k\) 大,你会如何?…

如何自做自己的网站网络设计开题报告

抽象节点这个特性自小程序基础库版本 1.9.6 开始支持。在组件中使用抽象节点有时&#xff0c;自定义组件模板中的一些节点&#xff0c;其对应的自定义组件不是由自定义组件本身确定的&#xff0c;而是自定义组件的调用者确定的。这时可以把这个节点声明为“抽象节点”。例如&am…

有什么网站可以做投票邯郸菜鸟网站建设

OD统一考试 题解&#xff1a; Java / Python / C 题目描述 一根X米长的树木&#xff0c;伐木工切割成不同长度的木材后进行交易&#xff0c;交易价格为每根木头长度的乘积。规定切割后的每根木头长度都为正整数,也可以不切割&#xff0c;直接拿整根树木进行交易。请问伐木工如…

响应网官方网站网站界面风格设计

1. 今日摸鱼计划 今天来学习一下ADC的原理&#xff0c;然后把ADC给实现 ADC芯片:ADC128S102 视频&#xff1a; 18A_基于SPI接口的ADC芯片功能和接口时序介绍_哔哩哔哩_bilibili 18B_使用线性序列机思路分析SPI接口的ADC芯片接口时序_哔哩哔哩_bilibili 18C_基于线性序列机的S…

量化投资 —— 实践

量化投资 —— 实践地址: https://item.taobao.com/item.htm?id=898078161839&mi_id=0000bSMU6-qva9mG_nEYyyLOcfGeJ5-tgwvwKtjY8IHE980&pvid=4580fb7a-c699-4f97-a5c0-8c810fa24035&scm=1007.40986.449…

详细介绍:性能优化 - 案例篇:缓存_Guava#LoadingCache设计

详细介绍:性能优化 - 案例篇:缓存_Guava#LoadingCache设计pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

2025年X射线管厂家最新企业品牌推荐排行榜,工业用金属陶瓷,波长色散荧光分析,应力衍射分析,管板角焊缝,轮胎检测,辐照,固定阳极波纹陶瓷,测厚,食品检测 X 射线管公司推荐

在工业无损检测领域,X 射线管作为核心元件,其质量与性能直接影响检测结果的准确性和可靠性,对国防、石油、电力、汽车零部件等关键行业的发展至关重要。当前,市场上 X 射线管厂家数量众多,产品质量参差不齐,部分…

AtCoder Beginner Contest 400

AT_abc400_d [ABC400D] Takahashi the Wall Breaker 一次踢两步也转移一下,直接搜 E - Ringos Favorite Numbers 3

网站托管服务方案网站建设办公软件销售技巧

目录 1、进程的虚拟内存分区与小于0x10000的小地址内存区 1.1、进程的虚拟内存分区 1.2、小于0x10000的小地址内存区 2、保存线程上下文的CONTEXT结构体 3、从汇编代码角度去理解多线程运行过程的典型实例 4、调用TerminateThread强制结束线程会导致线程中的资源没有释放…

2025 年北京档案存放公司 升职猫档案服务平台:16 年老牌机构的合规服务与高效解决方案解析

档案管理作为衔接个人发展与社会管理的关键环节,其规范性与便捷性直接影响考公、考研、落户、评职称等重要人生节点。随着 2025 年档案管理服务市场规模迈向 2000 亿元,数字化转型与异地办事需求持续升温,政策推动下…

设计一个企业网站大概多少钱创新的南昌网站制作

一、结构体 结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型”&#xff1b; 1. 结构体变量的定义和初始化 定义结构体变量的方式&#xff1a; 先声明结构体类型再定义变量名 在声明类型的同时定义变量 // 结构体类型的定义 struct stu {char name[50];int age;…

完整教程:⼤模型驱动的DeepInsight Copilot在蚂蚁的技术实践

完整教程:⼤模型驱动的DeepInsight Copilot在蚂蚁的技术实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

没有网站可以做百度直通车吗自己主机做网站服务器吗

0x01 产品简介 企语iFair协同管理系统是一款专业的协同办公软件,该管理系统兼容性强,适合多种企业类型。该软件永久免费,绿色安全,无需收取费用即可使用所有功能。企语iFair协同管理系统同时兼容了Linux、Windows两种操作系统 0x02 漏洞概述 企语iFair协同管理系统getup…

[免费]微信小代码网上花店系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025电容厂家最新品牌推荐排行榜白皮书,固态,高压,牛角,安规,CBB,超级,红宝石电解,螺栓,超级电容推荐这十家公司!

在科技迭代日新月异的当下,电容作为电子设备的核心基础元件,其性能品质直接决定了终端产品的运行稳定性、使用寿命与功能上限。无论是消费电子领域的智能手机、笔记本电脑,工业场景中的医疗设备、智能工控系统,还是…

北京网站优化前景工业信息化部网站备案

hello&#xff0c;我是大千UI工场&#xff0c;本篇分享智慧安防的大屏设计&#xff0c;关注我们&#xff0c;学习N多UI干货&#xff0c;有设计需求&#xff0c;我们也可以接单。 实时监控与预警 可视化大屏可以将安防系统中的监控画面、报警信息、传感器数据等实时展示在大屏上…

帝国cms做企业网站大连制作网站公司

上文讲了《Linux进程在内核眼中是什么样子的&#xff1f;》&#xff0c;可以理解内核关于进程线程的所有管理就通过一个结构体 —— task_struct。知道了内核眼中进程的描述&#xff0c;本文通过三个例子站在用户态看下进程线程是如何创建的&#xff0c;不同的创建方式又有哪些…