描述


http://www.lydsy.com/JudgeOnline/problem.php?id=1010

给出\(n\)和\(l\).有\(n\)个玩具,第\(i\)个玩具的长度是\(c[i]\),要求将玩具分成若干段,从\(i\)到\(j\)分为一段的长度为\(x=j-i+\sum_{k=i}^jc[k]\),费用为\((x-l)^2\).求最小费用.

分析


用\(dp[i]\)表示前\(i\)个玩具所需的最小费用,则有$$dp[i]=min\{dp[j]+(sum[i]-sum[j]+i-(j+1)-l)^2(1<=j<i)\}$$

其中\(sum[i]\)表示的是\(c[i]\)的前缀和.

为了方便,我们设$$A[i]=sum[i]+i,l=l+1$$

于是原方程久等价于$$dp[i]=min\{dp[j]+(A[i]-A[j]-l)^2(1<=j<i)\}$$

我们设\(j<k<i\)且在计算\(dp[i]\)的时候,决策\(k\)更优.也就是说$$dp[k]+(A[i]-A[k]-l)^2<dp[j]+(A[i]-A[j]-l)^2$$

在纸上写写画画,把式子打开再遍一下形,容易得到$$\frac{[dp[k]+(A[k]+l)^2]-[dp[j]+(A[j]+l)^2]}{2\times{A[k]}-2\times{A[j]}}<A[i]$$

是不是很像$$\frac{Y_k-Y_j}{X_k-X_j}$$的形式?

这玩意儿不就是斜率吗?!我们设它为\(g(k,j)\)

我们可以发现\(A[i]\)是单调递增的,所以所有决策可以转化为二维空间上的点集.

也就是说\(k\)这个点和\(j\)这个点的连线的斜率如果小于\(A[i]\),那么\(k\)这个决策就更优.

那么对于三个决策\(a<b<c\),如果有\(g(c,b)<=g(b,a)\),那么\(b\)决策一定不会被选中.为什么呢?我们来讨论一下(对于任意\(3<i<=n\)):

1.如果\(g(b,a)<A[i]\),那么必有\(g(c,b)<A[i]\),也就是\(c\)最优,选择决策\(c\).

2.如果\(g(b,a)>=A[i]\),那么\(b\)不是最优,最优可能是\(a\)或\(c\).

所以我们在新加入一个点的时候,就可以把它看作\(c\),然后把所有这样的\(b\)都去掉,直到\(g(c,b)>g(b,a)\),所以我们需要处理的斜率是单调递增的.

由于\(A[i]\)是单调递增的,所以对于任意的\(i<n\),如果满足上面的不等式,那么对于任意的\(i',i<i<=n\),由于\(A[i']>A[i]\),所以上不等式仍然成立,所以\(i'\)的最优决策的位置一定不比\(i\)的最优决策小.

这样我们就可以用一个单调队列分别维护队首和队尾啦.

 #include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn=+;
ll n,l,front,tail;
ll sum[maxn],A[maxn],dp[maxn],q[maxn];
inline ll pow_(ll x){ return x*x; }
inline ll up(int k,int j){ return dp[k]-dp[j]+pow_(A[k]+l)-pow_(A[j]+l); }
inline ll dn(int k,int j){ return *(A[k]-A[j]); }
int main(){
scanf("%lld%lld",&n,&l);
l++;
for(int i=;i<=n;i++){
ll t; scanf("%lld",&t);
sum[i]=sum[i-]+t;
A[i]=sum[i]+i;
}
front=,tail=;
for(int i=;i<=n;i++){
while(front+<tail&&up(q[front+],q[front])<=A[i]*dn(q[front+],q[front])) front++;
int j=q[front]; dp[i]=dp[j]+pow_(A[i]-A[j]-l);
while(front+<tail&&up(i,q[tail-])*dn(q[tail-],q[tail-])<=up(q[tail-],q[tail-])*dn(i,q[tail-])) tail--;
q[tail++]=i;
}
printf("%lld\n",dp[n]);
return ;
}

1010: [HNOI2008]玩具装箱toy

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 8864  Solved: 3529
[Submit][Status][Discuss]

Description

  P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压
缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过
压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容
器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一
个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j 制作容器的费用与容器的长度有关,根据教授研究,
如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。P教授不关心容器的数目,他可以制作出任意长度的容
器,甚至超过L。但他希望费用最小.

Input

  第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7

Output

  输出最小费用

Sample Input

5 4
3
4
2
1
4

Sample Output

1

HINT

Source

BZOJ_1010_[HNOI2008]_玩具装箱toy_(斜率优化动态规划+单调队列)的更多相关文章

  1. 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)

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

  2. [bzoj1010][HNOI2008]玩具装箱toy_斜率优化dp

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

  3. 【HNOI2008】玩具装箱TOY & 斜率优化学习笔记

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

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

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

  5. BZOJ_1096_[ZJOI2007]_仓库建设_(斜率优化动态规划+单调队列+特殊的前缀和技巧)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1096 有\(n\)个工厂,给出第\(i\)个工厂的到1号工厂的距离\(x[i]\),货物数量\ ...

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

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

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

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

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

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

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

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

随机推荐

  1. 包含为 HTTP 定义的状态代码的值(枚举)

    using System; namespace System.Net { // 摘要: // 包含为 HTTP 定义的状态代码的值. public enum HttpStatusCode { // 摘 ...

  2. OpenJudge/Poj 1321 棋盘问题

    1.链接地址: http://bailian.openjudge.cn/practice/1321 http://poj.org/problem?id=1321 2.题目: 棋盘问题 Time Lim ...

  3. Python3 内建模块 datetime/collections/base64/struct

    datetime 我们先看如何获取当前日期和时间: >>> from datetime import datetime >>> now = datetime.now ...

  4. thinkphp验证码的实现

    两种验证码验证实现,一种直接在form表单提交按钮实现验证,一种使用ajax传递参数实现验证: 1.直接在form表单提交按钮实现验证,在控制器VerifyController.class.php中写 ...

  5. [PHP]MemCached高级缓存

    Memcache Win32 的安装下载:Memcache Win32 [www.php100.com]   [www.jehiah.cz/projects/memcached-win32/] 1.解 ...

  6. 测试MySQL事务管理

    1.MySQL 版本 mysql> select version(); +------------+ | version() | +------------+ -log | +--------- ...

  7. ServiceController组件控制计算机服务

    private void Form1_Load(object sender, EventArgs e) { //下面的示例使用 ServiceController 类检查IIS服务是否已停止.如果该服 ...

  8. 【面试题】百度糯米java工程师面试

    面试经历: 技术题问的比较基础的java知识,有个编程题设计团购秒杀方面的设计,之前没有这种经验做的不好,做完题一个技术经理过来面试,主要问了一下之前做的什么项目,对struts,spring的原理做 ...

  9. 获取PDF页数

    下载pdfbox这个包,这俩个方法都可以: PDDocument doc = PDDocument.load("e://aa.pdf"); System.out.println(d ...

  10. Delphi XE10让android的界面设计摆脱繁杂

    设计一个选项卡. 大体图样: 1.创建一个multi_Device_Application;2.在form上放一个Rectangle1,设置align为top.设置fill属性的kind为Gradie ...