传送门: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∑j​Ck​ 制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为 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

输出格式

输出最小费用

输入输出样例

输入 #1复制

5 4
3
4
2
1
4
输出 #1复制

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的更多相关文章

  1. 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP

    题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...

  2. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  3. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 11893  Solved: 5061[Submit][S ...

  4. 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  5. P3195 [HNOI2008] 玩具装箱(斜率优化DP)

    题目链接 设\(d[i]\)为将前 \(i\) 个玩具装入箱中所需得最小费用 容易得到动态转移方程: \[d[i] = min(d[j] + (s[i]-s[j]+i-j-1-L)^2), (j< ...

  6. [luogu3195 HNOI2008] 玩具装箱TOY (斜率优化dp)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  7. 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化

    Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...

  8. Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定 ...

  9. 【BZOJ1010】【HNOI2008】玩具装箱toy (斜率优化DP) 解题报告

    题目: 题目在这里 思路与做法: 这题不难想. 首先我们先推出一个普通的dp方程: \(f_i = min \{ f_j+(i-j-1+sum_i-sum_j-L)^2\}\) 然后就推一推式子了: ...

随机推荐

  1. MyBatis 使用枚举或其他对象

    From<Mybatis从入门到精通> 1.笔记: <!-- 6.3 使用枚举或者其他对象 6.3.1 使用MyBatis提供的枚举处理器 不懂: 因为枚举除了本身的字面值外,还可以 ...

  2. ZIP:ZipStream

    ZipInputStream: ZipInputStream(InputStream in) :创建新的 ZIP 输入流. int read(byte[] b, int off, int len) : ...

  3. 鸟哥的Linux私房菜笔记第六章(二)

    文件内容查询 直接查询文件内容 查阅一个文件的内容可以使用指令cat/tac/nl. # [cat|tac|nl] 文件 区别: 1.cat是直接把文件内容输出到屏幕上,并且从第一行开始输出到末行 2 ...

  4. 模拟用户登录,内含验证码验证和request等操作

    模拟用户登录,内含验证码验证和jsp等操作 1.案例需求: 1. 访问带有验证码的登录页面login.jsp 2. 用户输入用户名,密码以及验证码. * 如果用户名和密码输入有误,跳转登录页面,提示: ...

  5. jsp页面中将CST时间格式化为年月日

    引入: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> 格式化: ...

  6. 快速java环境变量配置记录

      配置java环境变量就是将java.exe和javac.exe的路径告诉系统,让系统能够找到这两个exe文件,废话不多说,直接开始如何配置环境变量,安装jdk时记住你的安装位置.(配置时必须要的) ...

  7. linux下的FTP安装及调优

    前言: 在之前交换平台的开发中,FTP的各种操作算是核心功能点. 在FTP的开发中,遇到了不少坑. 如FTP需要设置被动模式,否则10M以上的包可能会上传失败. 如FTP需要设置囚牢模式,否则访问的文 ...

  8. Appium+python自动化(二十四)- 白素贞千年等一回许仙 - 元素等待(超详解)

    简介 许仙小时候最喜欢吃又甜又软的汤圆了,一次一颗汤圆落入西湖,被一条小白蛇衔走了.十几年后,一位身着白衣.有青衣丫鬟相伴的美丽女子与许仙相识了,她叫白娘子.白娘子聪明又善良,两个人很快走到了一起.靠 ...

  9. Centos7 安装Homestead环境2

    历史命令, -- :: cd /etc/yum.repos.d/ -- :: wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtu ...

  10. hdu第十场Cyclic

    本题主要是对用容斥的使用,正难则反,对于要求满足题意的可以求不满足题意的 先考虑对于长度至少为2的连续序列,易得其排列C(n,1)*(n-2)!,意为从剩下n个数字中选取连续的两个. 方法总计为n,即 ...