首页 > 其他分享 >斜率优化

斜率优化

时间:2024-07-26 21:28:22浏览次数:7  
标签:ll 决策 斜率 sum 下凸 优化 递增

斜率优化

[HNOI2008] 玩具装箱

状态转移方程:

设A为 \(sum_i+i\),B为 \(sum_j+j+L+1\)

简化可得:

\[f_i=min(f_i,f_j+A^2-2AB+B^2) \]

稍微分解一下,有:

\[f_i=f_j+A^2-2AB+B^2 \\ f_j+B^2=2AB+f_i-A^2 \]

设 \(f_j+B^2\) 为点 \(y\),\(2A\) 为 \(k\),\(B\) 为 \(x\),\(f_i-A^2\) 为 \(b\)。

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

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

斜率:

先看一张图:

  • 斜率(↑↑↑)

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

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

以下称 \(x_j\) 为 \(x\) 轴的 \(j\) 点,\(y_i\) 为在 \(y\) 轴的 \(i\) 点。

在绝v额集合中筛选出部分决策,使得在 \(x_j\) 递增的顺序下,相邻的决策点所炼成的线段的斜率单调递增。对于任意连续的三个所选决策 \(j_{i-1},j_{i},j_{i+1}\),都有:

\[\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}} \]

在对应坐标系中,相邻点之间连成的线段呈现出“下凸”形态,即为“凸包”。

  • 凸包(↑↑↑)

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

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

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

具体实施方案:

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

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

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

\[\forall\ p\ <\ k \\ \forall\ q\ >\ k \\ h_p<h_k<h_q \]

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

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

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;
}

标签:ll,决策,斜率,sum,下凸,优化,递增
From: https://www.cnblogs.com/Atserckcn/p/18326284

相关文章

  • 从零开始使用GPT-4o mini:配置、微调与优化
    引言随着人工智能技术的不断发展,OpenAI推出的GPT-4omini模型吸引了众多开发者的关注。作为一种更经济实惠且高效的语言模型,GPT-4omini在多模态推理和成本效益方面表现出色。本篇文章旨在分享使用GPT-4omini的经验,从初始设置到性能优化,涵盖各个应用场景,并提供实际的开发建议......
  • 服务器性能优化文档
    服务器性能优化文档1.概述本文档主要针对服务器性能优化方案进行介绍,旨在通过合理的配置和优化,提升服务器性能,降低资源占用,提高用户体验。2.性能问题分析CPU占用率过高:可能是系统进程过多、程序存在性能瓶颈、恶意攻击等原因导致。内存使用率过高:可能是程序内存泄漏、缓......
  • 【MATLAB源码-第159期】基于matlab的胡桃夹子优化算法(NOA)机器人栅格路径规划,输出做短
    操作环境:MATLAB2022a1、算法描述胡桃夹子优化算法(NutcrackerOptimizationAlgorithm,NOA)是一个灵感来源于胡桃夹子的故事的元启发式优化算法。这个故事中,胡桃夹子是一个能够将坚果壳轻易地破开以获取内部果仁的工具。在优化算法的语境下,这个过程被比喻为寻找问题解决方案......
  • Agent-Pro:通过策略级反思和优化学习进化的智能代理
    人工智能咨询培训老师叶梓转载标明出处大多数基于LLM的代理被设计为特定任务的解决者,需要复杂的提示工程来指导任务规则和调节LLM行为。这些任务解决者在面对复杂动态场景(如大型互动游戏)时,往往显得力不从心。为了解决这一问题,来自中科院、南京邮电大学、南京信息工程大学、......
  • SQL优化之索引
    SQL优化之索引索引索引分类:普通索引(Normal):最基本的索引,没有任何限制。唯一索引(UNIQUE):索引列的值必须唯一,但允许有空值。主键索引(PRIMARYKEY):唯一且不允许为空,一张表只能有一个主键索引。全文索引(FULLTEXT):用于全文搜索,适合大段文字的搜索。创建索引:创建普通索引:CREA......
  • 【数据结构与算法】快速排序万字全攻略:hoare版本、挖坑法、前后指针法、优化版、非递
          ......
  • 前端性能优化实践方向与方法
    0x01代码优化与压缩(1)HTML移除不必要的空白字符、注释和冗余标签,以减少文件大小使用命令npminstallhtml-minifier-g安装HTMLMinifier使用命令html-minifier-V确认安装成功在Node.js环境中配置index.js//引入HTMLMinifierconstminify=require("h......
  • SQL查询优化:动态选择返回字段
    在数据库操作中,我们经常遇到需要根据字段的存在与否动态选择返回值的场景。本文通过一个具体的例子,展示如何使用SQL语句来优化这种情况的处理,确保我们的查询结果既灵活又高效。背景假设我们有一个关于车票购买记录的数据库,表cz_ticket存储了票务信息,表sys_user存储了用户......
  • 优化企业运营:构建业务指标体系的必要性
    1企业运营优化,为啥这么难?小王是某医疗器械公司的市场负责人,在一次经营会上,总裁突然发问,让他汇报北非市场拓展情况。小王一时语塞,拿不出数据,也未掌握业务拓展现状,焦急万分。随着公司规模扩大,各市场负责人、区总、分公司领导,都面临相同的问题。怎样掌握经营状态?有无真实数......
  • 在K8S中,集群可以做哪些优化?
    在Kubernetes(K8S)集群中进行优化是一个多方面的任务,涉及从硬件层面到软件层面的诸多考虑。以下是一些常见的优化领域和技术:1.硬件优化选择合适的节点类型:根据工作负载的特点选择合适的计算、内存和存储资源。使用具有高I/O性能的SSD存储,对于I/O密集型工作负载尤......