斜率优化详解

news2024/11/27 0:28:35

斜率优化

[HNOI2008] 玩具装箱

状态转移方程:
f i = m i n ( f i , f j + ( s u m i + i − s u m j − j − L ) 2 ) i > j f_i=min(f_i,f_j+(sum_i+i-sum_j-j-L)^2){i>j} fi=min(fi,fj+(sumi+isumjjL)2)i>j
设A为 s u m i + i sum_i+i sumi+i,B为 s u m j + j + L + 1 sum_j+j+L+1 sumj+j+L+1

简化可得:
f i = m i n ( f i , f j + A 2 − 2 A B + B 2 ) f_i=min(f_i,f_j+A^2-2AB+B^2) fi=min(fi,fj+A22AB+B2)
稍微分解一下,有:
f i = f j + A 2 − 2 A B + B 2 f j + B 2 = 2 A B + f i − A 2 f_i=f_j+A^2-2AB+B^2 \\ f_j+B^2=2AB+f_i-A^2 fi=fj+A22AB+B2fj+B2=2AB+fiA2
f j + B 2 f_j+B^2 fj+B2 为点 y y y 2 A 2A 2A k k k B B B x x x f i − A 2 f_i-A^2 fiA2 b b b

考虑一个确定的点 ( B , f j + B 2 ) (B,f_j+B^2) (B,fj+B2) k = 2 A k=2A k=2A​ 的最小截距。

对于每个确定的 i i i,可令斜率为 h i h_i hi 的直线过每个决策点,都可求得一个截距。根据状态转移方程可知,其中截距最小的直线方程所经过的决策点即为左右决策。

斜率:

先看一张图:

  • 斜率(↑↑↑)

斜率就是坡度,是高度的平均变化率,用坡度来刻划道路的倾斜程度,也就是用坡面的切直高度和水平长度的比,相当于在水平方向移动一千米,在切直方向上升或下降的数值,这个比值实际上就表示了坡度的大小。

即:设 ( 0 , 0 ) (0,0) (0,0) 点为 a a a ( 3 , 0 ) (3,0) (3,0) 点为 b b b,则点 B B B 的斜率为 ∣ b − a ∣ B − b \frac{|b-a|}{B-b} Bbba​。

以下称 x j x_j xj x x x 轴的 j j j 点, y i y_i yi 为在 y y y 轴的 i i i 点。

在绝v额集合中筛选出部分决策,使得在 x j x_j xj 递增的顺序下,相邻的决策点所炼成的线段的斜率单调递增。对于任意连续的三个所选决策 j i − 1 , j i , j i + 1 j_{i-1},j_{i},j_{i+1} ji1,ji,ji+1,都有:
f j i − f j i − 1 x j i − x j i − 1 < f j i + 1 − f j i f j i + 1 − f j i \frac{f_{j_{i}}-f_{j_{i-1}}}{x_{j_i}-x_{j_{i-1}}}<\frac{f_{j_{i+1}}-f_{j_{i}}}{f_{j_{i+1}}-f_{j_i}} xjixji1fjifji1<fji+1fjifji+1fji
在对应坐标系中,相邻点之间连成的线段呈现出“下凸”形态,即为“凸包”。

  • 凸包(↑↑↑)

若斜率函数 h i h_i hi x j x_j xj 均为单调递增函数,随着 j j j 的递增,决策点的横坐标也单调递增,新决策必定会出现在整个凸包的最右端。又因为斜率函数具有单调性,所以每次需要求解的直线斜率 h i h_i hi 也单调递增。决策集合仅保留下凸曲线上相邻现代斜率大于 h i h_i hi 的剩余决策点,所以曲线最左端的决策点即为最优决策。

  • 最优决策、最优斜率、截距(设B点为最佳决策点)

根据如上性质,我们不难想出,用双端队列 q[l~r] 维护下凸曲线,队列中保存部分决策,对应下凸曲线上的决策点,满足 x i x_i xi​ 和 h i h_i hi​​ 都递增。

具体实施方案:
  • 为了保证队头即为最优决策,仅需保留下凸曲线上斜率大于 h i h_i hi 的点,从队头开始检查决策 q l q_l ql 和后续决策 q l + 1 q_{l+1} ql+1 对应点连接线的斜率。若该斜率小等于 h i h_i hi,则把 q l q_l ql 出队,继续检查寻得队头和后续决策,直至线段斜率大于 h i h_i hi
  • 直接取队头决策 j = q l j=q_l j=ql 为最优决策,进行状态转移。
  • 将当前状态 i i i 为新的决策从队尾插入。在插入前需要维护凸曲线性质,即三个决策点 q r − 1 , q r , i q_{r-1},q_r,i qr1,qr,i 对应的相邻线段需要满足斜率单调递增,否则吧决策 q r q_r qr 出队,继续检查 q r − 2 , q r − 1 , i q_{r-2},q_{r-1},i qr2,qr1,i,直至满足要求。设此操作一共进行了 n n n 轮,则最终需要判断的三个状态为 q r − n , q r − n + 1 , i q_{r-n},q_{r-n+1},i qrn,qrn+1,i

时间复杂度: O ( N ) O(N) O(N)

  • 若斜率函数 h i h_i hi 不满足单调性,则 x j x_j xj 为单调递增函数,队头不为最优决策,须保留整个下凸曲线,可在队列中二分查找,求出一个位置 k k k,使得:

∀   p   <   k ∀   q   >   k h p < h k < h q \forall\ p\ <\ k \\ \forall\ q\ >\ k \\ h_p<h_k<h_q  p < k q > khp<hk<hq

若满足以上条件,则 k k k 为最优决策。

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

AC Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,l;
const ll MAXN=5e4+5;
ll q[MAXN],sum[MAXN],f[MAXN];
ll head=1,tail=1;
ll j;
inline ll x(ll j)//x坐标 
{
	return sum[j];
}
inline ll y(ll j)//y坐标 
{
	return f[j]+(sum[j]+l)*(sum[j]+l);
}
inline double slope(ll i,ll j)//计算 
{
	return (double)(y(j)-y(i))/(x(j)-x(i));
}
inline ll compute(ll i,ll j)//代价公式 
{
	return (sum[i]-sum[j]-l)*(sum[i]-sum[j]-l);
}
int main(){
	scanf("%lld%lld",&n,&l);
	l++;//因为一直都是-l-1,干脆直接变为 -(l+1) 
	for(ll i=1;i<=n;i++)
	{
		scanf("%lld",&sum[i]);
		sum[i]+=sum[i-1]+1;//前缀和 
	}
	q[tail]=0;
	for(ll i=1;i<=n;i++)//dp
	{
		while(head<tail&&slope(q[head],q[head+1])<=(sum[i]<<1))//出队首条件 
			head++;
		j=q[head];//队首 
		f[i]=f[j]+compute(i,j);//计算 
		while(head<tail&&slope(q[tail-1],q[tail])>=slope(q[tail-1],i))//出队末条件 
			tail--;
		q[++tail]=i;//最优决策入队 
	}
	printf("%lld\n",f[n]);
	return 0;
}

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

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

相关文章

代码随想录算法训练营第36天(py)| 贪心 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

452. 用最少数量的箭引爆气球 力扣链接 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同…

【kubernetes】k8s集群安全机制 保姆级攻略

目录 一、认证&#xff08;Authentication&#xff09; Kubernetes 作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介&#xff0c; 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 A…

CCNA 0基础入门

OSI & TCP/IP OSI参考模型 TCP/IP协议 应用层 ------↓表示层 ------>应用层会话层 ------↑传输层 ------>传输层网络层 ------>网络互联层链路层 ------>网络接口层物理层 ------>↑ 物理层 传输的信号以及网线以及接线 主要作用是产生并检测电…

怎么修改Visual Studio Code中现在github账号

git config --global user.name “你的用户名” git config --global user.email “你的邮箱” git config --global --list git push -u origin your_branch_name git remote add origin

手部出现这4种症状,可能是糖尿病先兆!务必及时监测血糖

糖尿病来袭&#xff0c;手部或先知&#xff01;出现这 4 种症状&#xff0c;务必尽快监测血糖 第一&#xff0c;手指麻木感明显&#xff0c;当持续性的高血糖损害手部血管与神经末梢时&#xff0c;便会导致手指产生麻木以及刺痛之感。而且随着血糖不断升高&#xff0c;受损的血…

【QT Creator软件】解决中文乱码问题

QT Creator软件解决中文乱码问题 问题描述&#xff1a;Qtcreator安装好后打印中文在控制台输出乱码 在网上也查找了修改编辑器的默认编码为UTF-8&#xff0c;但是仍然没有任何作用&#xff0c;于是有了以下的解决方案 原因剖析&#xff1a;因为项目的编码与控制台的编码不一致…

Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件

打包与运行 window版本上制作 我们要把idea中的程序抽取出来作为一个独立的jar包 把jar包放到服务器上 服务器是长期运行的 我们就能随时访问了 在Maven的生命周期中选择package 打包功能 在资源管理器中查找 java -jar 文件名.jar java -jar 文件名.jar 但是我们在测试…

kotlin 中的字符串

一、字符类访问 1、字符串的访问跟js一样&#xff0c;可以使用索引来访问或者直接循环。 fun main() {val a: String "2024"// 方式一&#xff1a;for (item in a) {println(item) // 输出每一个字符}// 方式二&#xff1a;println("${a[0]}, ${a[1]}, ${a[2…

纯干货科普!水浸传感器品牌该怎么选?

在现代化生产过程中&#xff0c;漏水是常见的安全隐患之一。特别是机房、档案馆等高精密设备较多的场合&#xff0c;一旦没有及时解决漏水问题&#xff0c;就有可能导致线路故障、设备损坏甚至业务办理。绝大部分管理人员会选择安装水浸传感器&#xff0c;它能够帮我们及时检测…

bugku---misc---easy_nbt

1、题目描述 2、下载附件&#xff0c;解压之后得到 3、查找资料发现&#xff1a;NBT文件是Minecraft游戏数据文件&#xff0c;其中包含以命名二进制标签(NBT)格式保存的数据。这种格式用于存储大量二进制数据&#xff0c;通常包含有关Minecraft世界的信息。NBT数据通常以.dat文…

2024 全球软件研发技术大会官宣,50+专家共话软件智能新范式!

2024年的全球软件研发技术大会&#xff08;SDCon&#xff09;由CSDN和高端IT咨询与教育平台Boolan联合主办&#xff0c;将于7月4日至5日在北京威斯汀酒店举行。本次大会的主题为“大模型驱动软件智能化新范式”&#xff0c;旨在探讨大模型和开源技术的发展如何引领全球软件研发…

Xmind导入纯文本TXT方法

最近有很多同事咨询我如何在xmind直接导入纯文本txt笔记或者思维导图呢&#xff1f; 解决办法如下&#xff1a; 1.先打开xmind随便打开一个思维导图-文件-导出-marldown 2.选中导出的markdown文件。右键-打开方式-苹果系统选择文本编辑&#xff0c;Win系统选择记事本 3.按照图示…

计算机二级Access选择题考点

在Access中&#xff0c;若要使用一个字段保存多个图像、图表、文档等文件&#xff0c;应该设置的数据类型是附件。在“销售表"中有字段:单价、数量、折扣和金额。其中&#xff0c;金额单价x数量x折扣&#xff0c;在建表时应将字段"金额"的数据类型定义为计算。若…

用Vue3实现一个3D图的在线展示

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 代码相关技术博客 应用场景 该代码段用于创建一个带有社交媒体链接的欢迎卡片&#xff0c;用于网站或应用程序的登录页面或主页。 基本功能 该欢迎卡片提供以下功能&#xff1a; 显示欢迎信息和感谢访问网…

25年后回顾融智学新范式(感受人机互助新时代到了的愉悦,体验人机互助新时代的理解和表达的深入浅出)

25年后回顾融智学新范式 &#xff08;不仅感受人机互助新时代到了的愉悦&#xff0c;更体验人机互助新时代的理解和表达的深入浅出&#xff09; 一句话概述&#xff1a; 《融智学新范式》是一种创新的理论框架&#xff0c;它提出了协同智能主体的概念框架&#xff0c;通过严…

大模型高级 RAG 检索策略之流程与模块化

我们介绍了很多关于高级 RAG&#xff08;Retrieval Augmented Generation&#xff09;的检索策略&#xff0c;每一种策略就像是机器中的零部件&#xff0c;我们可以通过对这些零部件进行不同的组合&#xff0c;来实现不同的 RAG 功能&#xff0c;从而满足不同的需求。 今天我们…

连接查询-外连接(FULL JOIN)、内连接(JOIN)、自身连接

一、表与表之间存在着某种联系&#xff0c;如果一个查询必须在多个表之间完成&#xff0c;则需要用到连接查询 二、连接查询的SQL查询语句 格式&#xff1a; SELECT A1&#xff0c;A2&#xff0c;...&#xff0c;Am FROM R1&#xff0c;R2&#xff0c;..&#xff0c;Rn WH…

大厂Java面试题:详细描述MyBatis缓存的实现原理

大家好&#xff0c;我是王有志。今天给大家带来的是一道来自光大科技的 MyBatis 面试题&#xff1a;详细描述MyBatis缓存的实现原理。 在通过源码分析 MyBatis 一二级缓存的实现原理前&#xff0c;我先给出我的回答。 首先是 MyBatis 一级缓存的实现原理&#xff1a; MyBaits…

Clion控制台打印中文乱码

第一步 第二步 第三步 ctrlaltshift/ 把run.processes,with.pty

文字悬停效果

文字悬停效果 效果展示 CSS 知识点 CSS 变量使用回顾-webkit-text-stroke 属性的运用与回顾 页面整体结构实现 <ul><li style"--clr: #e6444f"><a href"#" class"text">First</a></li><li style"--cl…