P3195 [HNOI2008]玩具装箱TOY 斜率优化dp
传送门:https://www.luogu.org/problem/P3195
题目描述
P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为 1\cdots N1⋯N 的 NN 件玩具,第 ii 件玩具经过压缩后变成一维长度为 C_iCi .为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第 ii 件玩具到第 jj 个玩具放到一个容器中,那么容器的长度将为 x=j-i+\sum\limits_{k=i}^{j}C_kx=j−i+k=i∑jCk 制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为 xx ,其制作费用为 (X-L)^2(X−L)2 .其中 LL 是一个常量。P教授不关心容器的数目,他可以制作出任意长度的容器,甚至超过 LL 。但他希望费用最小.
感谢@ACの666 提供的Latex题面
输入格式
第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7
输出格式
输出最小费用
输入输出样例
5 4
3
4
2
1
4
1
先来梳理一下题意吧
就是说有n个玩具 要放到好多个容器里(容器个数不限)
使得所花费的费用最小
那么每个容器的费用就是 (X-L)^2 容器长度为x 另外输入时还告诉你一个L
。。。。。
天哪看起来好难的样子
很显然这一道题要是暴力搜索肯定是拿不了几分
做法一:朴素做法
事实上 朴素算法还是不错的
就是说 i:1-n j:1-i
dp [ i ] = min ( dp [ j -1] +( sum [ i ] - sum [ j-1 ] + i - j - L )2)
啊啊啊 那是什么东西
就是说dp[i]就表示前i个玩具
就是说 sum [ i ] - sum [ j-1 ] + i - j 这个肯定非常好理解 题目中已经说 就是那个X
“那么每个容器的费用就是 (X-L)^2 容器长度为x 另外输入时还告诉你一个L”
那么很明显 这个就没有什么问题啦
感觉这个还是不错
但是::这是n2的做法啊啊啊啊啊
先写一下试试吧

p.s.才20分。。。呜呜呜
然后就开始一脸发蒙了
斜率优化开始
斜率优化是什么?
不知道···
就是说
首先一次函数肯定知道吧(不知道查一下)
y=kx+b
知识大普及 k是斜率 b是截距
and then 知道又有啥用。。。
我们上面不是得到的一个式子吗 我们可以把它转化一下 使得它不超时
dp [ i ] = min ( dp [ j -1] +( sum [ i ] - sum [ j-1 ] + i - j - L )2)
然后那 可以把这个式子拆一下
我们令a[i]=sum[i]+i
令b[j]=sum[j-1]+j+L; 郑重声明 这个是可以预 处理出来的 (其实无所谓)
这样子接下来可能会好受一点
先把min去了吧 这样比较好看一些
dp [ i ] = dp [ j -1] +( sum [ i ] - sum [ j-1 ] + i - j - L ) 2
dp [ i ] = dp[ j -1] +( a[i]-b[j])2
dp[i]=dp[j-1]+a[i]2+b[j]2-2*a[i]*b[j];
2*a[i]*b[j]+dp[i]=dp[j-1]+a[i]2+b[j]2;
假设x=b[j] y=dp[j-1]+b[j]2
首先 你要先明确看到这里没有问题
2*a[i]*x+dp[i]=y+a[i]2
y=2*a[i]*x+dp[i]-a[i]2;
嗯嗯嗯呃
然后干嘛 先自己晕一会
啊哈!
y=kx+b
和上面的那个式子对照一下 会发现一个非常神奇的事情
k:2*a[i]
b:dp[i]-a[i]2
enenen别跑偏了 我们要求的是dp[i]对吧 就是那个b里面的
因为a[i]2是固定的对吧(那还用你说。。)
也就是说!!!!!!!求出来最小的b也就能求出来最小的dp[i]
算了讲到这里已经讲不下去了
还是来粘贴一段接下来的讲解吧 我只负责讲一下怎么转化为函数表达式啦



#include<bits/stdc++.h>
using namespace std;
const int maxn=;
#define int long long
#define u32 unsigned
int f[maxn],g[maxn];
u32 n,L,q[maxn];
int SQR(int x){
return x*x;
}
double Get(u32 j,u32 k){
return ((f[j]+SQR(g[j])+*L*g[j])-(f[k]+SQR(g[k])+*L*g[k]))/(double)(g[j]-g[k]);
}
signed main(){
scanf("%u%u",&n,&L);
L++;
u32 i,j,s,t,K;q[s=t=]=;
for(i=;i<=n;i++)
scanf("%lld",&g[i]),g[i]+=g[i-];//维护前缀和(很显然这会更方便啊)
for(i=;i<=n;i++) g[i]+=i;//就是讲解中 的那个a[i]
for(i=;i<=n;q[++t]=i++){//我也是第一次发现这么一个神奇的写法 q就是维护了一个单调队列
K=g[i]<<;//斜率 k=2*a[i]
while(s<t&&Get(q[s+],q[s])<=K) s++; //找到能形成最小值的点
j=q[s];f[i]=f[j]+SQR(g[i]-g[j]-L);
while(s<t&&Get(q[t],q[t-])>=Get(i,q[t])) t--;//维护凸包
}
printf("%lld\n",f[n]);
return ;
}
P3195 [HNOI2008]玩具装箱TOY 斜率优化dp的更多相关文章
- 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP
题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 11893 Solved: 5061[Submit][S ...
- 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- P3195 [HNOI2008] 玩具装箱(斜率优化DP)
题目链接 设\(d[i]\)为将前 \(i\) 个玩具装入箱中所需得最小费用 容易得到动态转移方程: \[d[i] = min(d[j] + (s[i]-s[j]+i-j-1-L)^2), (j< ...
- [luogu3195 HNOI2008] 玩具装箱TOY (斜率优化dp)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...
- Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定 ...
- 【BZOJ1010】【HNOI2008】玩具装箱toy (斜率优化DP) 解题报告
题目: 题目在这里 思路与做法: 这题不难想. 首先我们先推出一个普通的dp方程: \(f_i = min \{ f_j+(i-j-1+sum_i-sum_j-L)^2\}\) 然后就推一推式子了: ...
随机推荐
- Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?
导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...
- Spark学习之RDD
RDD概述 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的集合 ...
- apache CXF Service 简单使用
cxf介绍 框架官网:cxf.apache.org 支持多种协议: SOAP1.1,1.2 XML/HTTP CORBA(Common Object Request Broker Architectu ...
- C#3.0新增功能07 查询表达式
连载目录 [已更新最新开发文章,点击查看详细] 查询是什么及其作用是什么 查询是一组指令,描述要从给定数据源(或源)检索的数据以及返回的数据应具有的形状和组织. 查询与它生成的结果不同. 通常情 ...
- 【MySQL】(三)文件
本篇文章分析构成MySQL数据库和InnoDB存储引擎表的各种累类型文件.这些文件有以下这些. 参数文件:告诉MySQL实例启动时在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内 ...
- CentOS 下编译安装Apache
CentOS 下编译安装Apache 卸载原有的apache 首先从 http://httpd.apache.or 下载apache源码包httpd-2.4.4.tar.gz然后从 http://ap ...
- 我对微服务、SpringCloud、k8s、Istio的一些杂想
一.微服务与SOA “微服务”是一个名词,没有这个名词之前也有“微服务”,一个朗朗上口的名词能让大家产生一个认知共识,这对推动一个事务的发展挺重要的,不然你叫微服务他叫小服务的大家很难集中到一个点上. ...
- Android CHM文件阅读器
CHM格式是1998年微软推出的基于HTML文件特性的帮助文件系统.以替代早先的winHelp帮助系统,它也是一种超文本标识语言.在Windows 98中把CHM类型文件称作“已编译的HTML帮助文件 ...
- spring boot中的声明式事务管理及编程式事务管理
这几天在做一个功能,具体的情况是这样的: 项目中原有的几个功能模块中有数据上报的功能,现在需要在这几个功能模块的上报之后生成一条消息记录,然后入库,在写个接口供前台来拉取消息记录. 看到这个需求,首先 ...
- logback使用配置
一:logback.xml配置内容如下 <?xml version="1.0" encoding="UTF-8"?> <!-- Copyrig ...