描述


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. 用函数的地址调用函数 C++ MFC

    先说一段废话,幸亏我汇编基础(基础 基础 基础)扎实,否则这个问题真的恶心到我了正题  因为有特殊需求, 需要写一个类似于接口的功能,但是因为用到的次数不多再加上C++写接口各种麻烦所以想通过函数的地 ...

  2. 超强的ACM题目类型总结

    转:初期: 一.基本算法:       (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.       ...

  3. PHP学习笔记——PHP脚本和JAVA连接mysql数据库

    环境 开发包:appserv-win32-2.5.10 服务器:Apache2.2 数据库:phpMyAdmin 语言:php5,java 平台:windows 10 java驱动:mysql-con ...

  4. JS的词法作用域

    词法作用域定义实现的规则: 1 函数作用域实在定义的时候决定的,而不是在执行时候决定 2 为了实现这种词法作用域,函数内部不仅包含函数代码逻辑,还必须引用当前的作用域链. 3 函数对象可以通过作用域链 ...

  5. OpenCV2学习笔记05:矩阵翻转

    对图像进行翻转或旋转可以使用cv::flip()函数,可以实现将一个二维矩阵沿X轴.Y轴或者同时沿XY轴翻转.函数原型如下: C++: void flip(InputArray src, Output ...

  6. jQuery.hhLRSlider 左右滚动图片插件

    /**  * jQuery.hhLRSlider 左右滚动图片插件  * User: huanhuan  * QQ: 651471385  * Email: th.wanghuan@gmail.com ...

  7. java basic

    //java 声明常量 //final 数据类型 常量名=值; //as: final float PI=3.14f;/ PI=3.14002F //默认浮点为 double //break:跳出多重 ...

  8. Centos6.5下rsync文件同步安装配置及遇到的问题解决方法

    实验节点如下: 源节点:192.168.0.111 备份节点:192.168.0.112 ------------------------------以下部分在两个节点上执行1.防火墙开放873端口( ...

  9. slqplus 帮助手册

    1.查看sqlplus的帮助是否可用,必须登录了才可用. D:\app\product\\db_1\sqlplus\admin\help>sqlplus /nolog SQL :: Copyri ...

  10. WPF读书笔记(第一天)

    今天开始学习WPF,大家都推荐<深入浅出WPF>这本书,一下是我觉得此书中重要的地方,记录下来以便以后回顾,也希望其他人看到了对你们有帮助. 1.XAML是可扩展应用程序标记语言 是WPF ...