职务地址:http :// www . lydsy . com / JudgeOnline / problem . php ? id = 1010

题目大意:见原题。

算法分析:

设s[i]为c[i]的前缀和,f[i]表示第1个物品到第i个物品的最小代价。

易得DP方程为f[i]=min(f[j]+(s[i]-s[j]+i-j+1-l)^2)。

设t[i]=s[i]+i。则f[i]=min(f[j]+(t[i]-t[j]+1-l)^2。

设m=t[i]-l-1。则f[i]=min(f[j]+(m-t[j])^2)。

对i做决策时,设j,k为2个一般的决策点。设j<k。

若k比j优,则有

f[k]+(m-t[k])^2<f[j]+(m-t[j])^2

展开,得

f[k]+m^2-2*m*t[k]+t[k]^2<f[j]+m^2-2*m*t[j]+t[j]^2

化简,得

((f[k]+t[k]^2)-(f[j]+t[j]^2))/(t[k]-t[j])<2*m=2*(s[i]+i-l-1)

于是能够用单调队列来优化DP。

单调队列优化DP的伪代码:

for (int i=1;i<=n;++i){
while (h+1<t && slope(q[h],q[h+1])<...) h++;
f[i]=...;
while (h+1<t && slope(q[t-2],q[t-1])>slope(q[t-1],i)) t--;
q[t++]=i;
}

斜率优化的2个重要结论(对于此题):

1)j<k,若slope(j,k)<2*(s[i]+i-l-1),则k比j优。

(PS:不等式左边为仅仅与j,k有关的式子。不等式右边为仅仅与i有关的式子)

2)j<k<l,若slope(j,k)>slope(k,l),则k能够被舍去。

Code:

#include <cstdio>

#define N 50000

using namespace std;

int n,l,h,t=1,c[N+10],q[N+10];
long long s[N+10],f[N+10]; template <typename T>
inline T sqr(T x){return x*x;}
inline double slope(int i,int j){return (f[i]+sqr((double)s[i]+i)-f[j]-sqr((double)s[j]+j))/(s[i]+i-s[j]-j);} int main(){
#ifndef ONLINE_JUDGE
freopen("1010.in","r",stdin);
freopen("1010.out","w",stdout);
#endif
scanf("%d%d",&n,&l);
for (int i=1;i<=n;++i) scanf("%d",&c[i]);
for (int i=1;i<=n;++i) s[i]=s[i-1]+c[i];
for (int i=1;i<=n;++i){
while (h+1<t && slope(q[h],q[h+1])<2*(s[i]+i-l-1)) h++;
f[i]=f[q[h]]+sqr(s[i]-s[q[h]]+i-q[h]-1-l);
while (h+1<t && slope(q[t-2],q[t-1])>slope(q[t-1],i)) t--;
q[t++]=i;
}
printf("%lld\n",f[n]);
return 0;
}

By Charlie Pan

Jul 18,2014

版权声明:本文博客原创文章。博客,未经同意,不得转载。

BZOJ 1010: [HNOI2008]玩具包装toy的更多相关文章

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

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

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

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

  3. bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7874  Solved: 3047[Submit][St ...

  4. BZOJ 1010 [HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7184  Solved: 2724[Submit][St ...

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

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

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题意: 思路: 容易得到朴素的递归方程:$dp(i)=min(dp(i),dp(k)+(i-k ...

  7. BZOJ 1010: [HNOI2008]玩具装箱toy | 单调队列优化DP

    原题: http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题解: #include<cstdio> #include<algo ...

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题意: 有n条线段,长度分别为C[i]. 你需要将所有的线段分成若干组,每组中线段的 ...

  9. BZOJ.1010.[HNOI2008]玩具装箱toy(DP 斜率优化/单调队列 决策单调性)

    题目链接 斜率优化 不说了 网上很多 这的比较详细->Click Here or Here //1700kb 60ms #include<cstdio> #include<cc ...

随机推荐

  1. FileStream:The process cannot access the file because it is being used by another process

    先看下面一段代码(先以共享的方式打开文件读写,然后以只读的方式打开相同文件): FileStream fs  = new FileStream(filePath, FileMode.Open, Fil ...

  2. 微渠道发展 BAE交通运输平台和java呼声,微信mysql数据库开发实例 --图文开发教程

    持续更新 BAE java开展mysql数据库 图文教程 BAE java语言发展mysql源码下载: 目前微信的发展.BAE开展.java开展.mysql教程开发非常,的介绍基于BAE平台.java ...

  3. Android运用自己的标题栏

    Android程序的标题栏TitleBar区域很单调,如果想个性化一些可以通过下面的方法来为自己软件的标题定制一个layout布局文件,比如浏览器的标题栏,它包含了网站的Favicon,自定义的进度条 ...

  4. Object-C 新手教程

    大纲 開始吧 下载这篇教学 设定环境 前言 编译 hello world 创建 Classes @interface @implementation 把它们凑在一起 具体说明... 多重參数 建构子( ...

  5. 在用TabbarController中出现navigationController 嵌套报错

    假设出现: nested push animation can result in corrupted navigation bar Finishing up a navigation transit ...

  6. jQuery 完成ajax传jsonObject数据,并在后台处理

    效果图: 1.js文件封装的几个js工具 <span style="font-family:KaiTi_GB2312;font-size:18px;">//兼容ie i ...

  7. 第三篇——第二部分——第四文 配置SQL Server镜像——非域环境

    原文:第三篇--第二部分--第四文 配置SQL Server镜像--非域环境 本文为非域环境搭建镜像演示,对于域环境搭建,可参照上文:http://blog.csdn.net/dba_huangzj/ ...

  8. java.lang.VerifyError

    public class VerifyErrorextends LinkageError Thrown when the "verifier" detects that a cla ...

  9. 【转】Android 4.3源码下载及问题解决

    [html] view plaincopy 1 2 3 4 5 6 7 8 9 10 11 jianguoliao@jianguoliao-Lenovo-IdeaPad-Y470:~$ cat /et ...

  10. JDBC在getConnection之前为什么要调用Class.forName(转)

    获取一个数据库连接的通用模板如下: String driver = "oracle.jdbc.OracleDriver"; String url = "jdbc:orac ...