首页 > 其他分享 >斜率优化初探:以 [HNOI2008]玩具装箱 为例

斜率优化初探:以 [HNOI2008]玩具装箱 为例

时间:2024-10-08 20:14:09浏览次数:8  
标签:截距 为例 int 决策 long times 斜率 HNOI2008 装箱

斜率优化初探:以 [HNOI2008]玩具装箱 为例

记 \(f[i]\) 表示装好前 \(i\) 个的最小花费。容易写出转移:

\[f[i] = \min_{j \lt i} \ [f[j]+(s[i] - s[j] - 1 - L) ^ 2] \]

直接转移是 \(O(n ^ 2)\) 的,我们考虑斜率优化。

斜率优化的过程

(一)问题转化成了求最小截距。

我们把 \(min\) 的外壳去掉,并且提前把 \(L +1\) (式子更简洁) 可以得到:

\[f[i] = f[j]+(s[i] - s[j] - 1 - L) ^ 2 \]

把括号打开,可以得到:

\[f[i] = f[j] + s[i] ^ 2 - 2\times s[i] \times L - 2 \times s[i] \times s[j] + (s[j] + L) ^ 2 \]

移项后得到:

\[(2s[i]) \times s[j] + (f[i] - s[i] ^ 2 + 2 \times s[i] \times L) = f[j] + (s[j] +L) ^ 2 \]

此时,如果我们把这看做一个一次函数,那么

\[k = 2s[i]\\ x = s[j]\\ b = (f[i] - s[i] ^ 2 + 2 \times s[i] \times L)\\ y = f[j] + (s[j] +L) ^ 2 \]

注意到固定 \(i\) 后,\(k\) 是固定的。而对于每个 \(j\), 我们都可求出对应的 \((x, y)\)。此时当 \(b\) 最小时,\(f[i]\) 也会最小。

(二)截距在哪里最小?(图像理解)

我们知道有用的 \(j\) 在二维平面上形成的点阵是个凸包。

我们惊讶的发现斜率竟然是固定的!我们可以平移这条直线至与凸包相切,显然这个切点 \(E\), 就对应着最小的截距。

怎么找这个点呢?发现 \(E\) 点以前的斜率都小于当前 \(k\), \(E\) 点之后的斜率都大于等于 \(k\), 因此可以二分这个位置。时间复杂度 \(O(nlogn)\)。

(三)决策单调性的优化(图像理解)

决策单调性的定义:

设 \(j_0[i]\) 表示 \(f[i]\) 转移的最优决策点,那么 决策单调性 可以描述为 \(\forall i \le i'\), \(j_0[i] \le j_0[i']\)。即随着 \(i\) 递增,所找到的 最优决策点 是递增态(非严格递增)。

发现 \(k = 2s[i]\), 而 \(s[i]\) 是前缀和,显然是递增的,那么我们的决策点也一定会越来越大(因为目标斜率递增)

详细证明参见参考博客。

用单调队列维护凸包的点集,分三步:

  1. 将斜率比目标斜率小的点弹出, 在队首位置找到最优决策点 \(j\)。
  2. 用最优决策点 \(j\) 更新 \(dp[i]\)。
  3. 把新的点加入队列中。

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

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
#define int ll
using namespace std;
using ll = long long;
const int N = 1e5 + 5;
int L, n, h = 1, t = 0;
int f[N], s[N], q[N];
int X(int j){
	return s[j] +L;
}
int Y(int j){
	return f[j] + (s[j] + L) * (s[j] + L);
}
long double slope(int i, int j){
	return (long double)(Y(i) - Y(j)) / (long double)(X(i) - X(j));
}
signed main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> L;
	++L;
	F(i, 1, n) cin >> s[i], s[i] += s[i - 1] + 1;
	q[++t] = 0;
	F(i, 1, n){
		while(h < t && slope(q[h], q[h + 1]) < 2 * s[i]) ++ h;
		int j = q[h];
		f[i] = f[j] + (s[i] - s[j] - L) * (s[i] - s[j] - L);
		while(h < t && slope(q[t - 1], q[t]) > slope(q[t - 1], i)) -- t;
		q[++ t] = i;
	}
	cout << f[n] << '\n';
	return 0;
}

反思:移项的依据

为了用 \(Function(i)\) 表示出 \(Function(j)\),我们把含 \(i\) 的东西移到等式左边,把含 \(j\) 的东西移到等式右边。以此整理出 "不变的 \(k\),待求解的 \(b\),确定的 \(x, y\)"。 记得 \(f[i]\) 一定要放在截距 \(b\) 里面!因为我们是对 截距 求解极值。

标签:截距,为例,int,决策,long,times,斜率,HNOI2008,装箱
From: https://www.cnblogs.com/superl61/p/18452404

相关文章

  • 【产品经理修炼之道】- 中后台产品实践:以智慧城市场景【数据融合治理平台】产品为例
    智慧城市治理产品该如何构建?作者结合自身经历,总结过去所负责的产品和项目,梳理并构建城市治理(智慧城市)的整体业务架构、以及通过调研分析城市治理的发展趋势和市场情况,并对其需要进行产品设计。本篇文章,旨在对个人从事TOG工作3年半(待过2家做2G业务的公司)的工作内容的一个总结......
  • 共享单车轨迹数据分析:以厦门市共享单车数据为例(八)
    副标题:基于站点800m范围内评价指标探究——以吕厝站为例上篇文章我们以厦门市为例,来通过POI和优劣解距离法(TOPSIS)来研究厦门岛内以800m作为辐射范围的地铁站哪些地铁站发展的最好,根据综合得分指数可以知道,吕厝以综合综合得分指数第一位居榜首,这篇我们从微观视角来看看综合得分......
  • 异形热力图的绘制(以鞋垫上的柔性压力传感器阵列离散点绘制足部压力热力图为例)
    使用OpenCV和Python处理图像轮廓并离散化点集相信柔性传感器阵列领域的研究者们都看过如下的图(侵删):仿真这种云图只需要直接提取面就可以,但是实际我们制作的阵列只有离散点,甚至是不规则位置(非栅格、密度小)的几个器件,要怎么绘制成如上图所示呢?像我这种只会简单规则云图......
  • 若依前后端分离版集成x-file-storage插件实现文件上传(以华为云obs为例)
    1.x-file-storage官网  https://x-file-storage.xuyanwu.cn/#/2.打开华为云官网 https://activity.huaweicloud.com/  ①左上角菜单栏中选择产品,输入obs存储            ②根据自己的业务需求选择规格即可            ③购买......
  • 共享单车轨迹数据分析:以厦门市共享单车数据为例(六)
    副标题:.基于POI数据的站点功能混合度探究——以厦门市为例(一)为了保证数据时间尺度上的一致性,我们从互联网上下载了2020年的POI数据,POI数据来源于高德地图API平台,包括名称、大小类、地理坐标等。并将高德地图POI数据的火星坐标系GCJ-02统一转换为通用的WGS-84地理坐标系,......
  • 以学校数据模型为例,掌握在DAS下使用GaussDB
    @目录题目具体操作一、表的创建二、表数据的插入三、数据查询目的:这里以学校数据库模型为例,介绍GaussDB数据库、表等常见操作,以及SQL语法使用的介绍。题目假设A市B学校为了加强对学校的管理,引入了华为GaussDB数据库。在B学校里,主要涉及的对象有学生、教师、班级、院系和课程......
  • P3195 [HNOI2008] 玩具装箱
    P3195[HNOI2008]玩具装箱\(dp_i\)表示前\(i\)个玩具的最小代价。\(s_i=\sum_{j\lei}c_i+1\)。设\(L'=L+1\)。\(dp_i=\min_{j<i}\{dp_j+(s_i-s_j-L')^2\}\)\(dp_i-s_i'^2+2s_iL'=\min_{j<i}\{dp_j+(s_j'+L)^2-2s_is_j\}\)\(b=y......
  • [Java基础]拆箱装箱
    在介绍本期文章内容之前,让我们先来看一小段代码:inta=10;Integerb=10;if(b==a){ System.out.println("相等");}执行结果应该大家是毋庸置疑的,10等于10,自然会输出相等。但是有一个问题,a明明是int类型,而b则是Integer类型。两个明显是不同类型的对象,为什么能够相等呢?这......
  • 如何投IEEE论文(Transactions on Cybernetics为例)
    文章目录1.下载对应的论文模板2.进入提交论文信息的界面3.填写论文中必要的信息3.1ArticleType3.2UploadManuscript3.3Title3.4Abstract3.5Authors3.6AuthorDetails3.7MathOrganizations3.8AdditionalInformation3.9FinalReview终审1.下载对应的论......
  • AS-VJ900实时视频拼接系统产品介绍:多路视频拼接方法和操作(以九路视频9画面拼接成9x1的
    目录一.拼接平台介绍和无缝拼接理论基础1.1拼接平台简单介绍1.2视频无缝拼接理论基础二.多路视频拼接的准备工作2.1视频选择三.拼接步骤3.1视频录入3.2找出公共部分3.3裁剪和完善3.3.1视频裁剪去重3.3.2继续完善3.4继续拼接直至完成四.视频拼接结果显示   ......