http://www.lydsy.com/JudgeOnline/problem.php?id=1010 (题目链接)

题意

  给定N个物品,可以连续的划分为若干个组,每个组的代价是(物品数-1+每个物品单独的代价-L)^2,求最小代价

Solution

  决策单调性证明+斜率优化,转自:http://blog.csdn.net/slongle_amazing/article/details/50330481

  很明显我们得到朴素的转移方程:${dp[i]=min(dp[j]+(i-j-1+sum[i]-sum[j]-L)^2),(0<=j<i)}$,时间复杂度为${O(n^2)}$

  我们定义:${f[i]=sum[i]+i,C=L+1}$,那么上式变成:${dp[i]=min(dp[j]+(f[i]-f[j]-C)^2),(0<=j<i)}$

  然后我们来证明决策的单调性

  假设在i处有两个决策点${j,k(j<k)}$,且${k}$的决策比j好,

  即:${dp[j]+(f[i]-f[j]-C)^2>dp[k]+(f[i]-f[k]-C)^2——————[1]}$

  假设${i}$后面的某状态${t}$有:${f[t]=f[i]+v (t>i)}$

  即证:$${dp[j]+(f[t]-f[j]-C)^2>dp[k]+(f[t]-f[k]-C)^2}$$

$${dp[j]+(f[i]+v-f[j]-C)^2>dp[k]+(f[i]+v-f[k]-C)^2}$$

$${dp[j]+(f[i]-f[j]-C)^2+2*v*(f[i]-f[j]-C)+v^2>dp[k]+(f[i]-f[k]-C)^2+2*v*(f[i]-f[k]-C)+v^2}$$

  由[1]我们得到:$${f[i]-f[j]-C>f[i]-f[k]-C}$$

$${f[k]>f[j]}$$

  显然${f[i]}$单调递增且${k>j}$,那么假设${[1]}$成立。

  展开${[1]}$:$${dp[j]+f[i]^2+(f[j]+c)^2-2*f[j]*(f[j]+C)>dp[k]+f[i]^2+(f[k]+C)^2-2*f[i]*(f[k]+C)}$$

$${dp[j]+(f[j]+C)^2-dp[k]-(f[k]+C)^2>2*f[i]*(f[j]-f[k])}$$

$${\frac{dp[j]-dp[k]+(f[j]+C)^2-(f[k]+C)^2}{2*(f[j]-f[k])}<f[i]}$$

  于是我们得到斜率${slope(j,k)}$:

$${slope(j,k)=\frac{dp[j]-dp[k]+(f[j]+C)^2-(f[k]+C)^2}{2*(f[j]-f[k])}}$$

$${有slope(j,k)<f[i]}$$

  所以当${j<k}$且${slope(j,k)<f[i]}$时,我们可以${O(1)}$判断${k}$比${j}$更优。

  于是我们用单调队列维护这个操作即可。

  当${slope(q[l],q[l+1])<f[i]}$时,${q[l+1]}$比${q[l]}$更优,pop队首。

  当不满足上凸性质,即${slope(q[r-1],q[r])>slope(q[r],i)}$时,pop队尾。

代码

// bzoj1010
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<60)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=50010;
int n,L;
LL a[maxn],f[maxn],s[maxn],dp[maxn],q[maxn]; double slope(LL a,LL b) {
return (dp[a]-dp[b]+(f[a]+L)*(f[a]+L)-(f[b]+L)*(f[b]+L))/(2.0*(f[a]-f[b]));
}
int main() {
scanf("%d%d",&n,&L);L++;
for (int i=1;i<=n;i++) scanf("%lld",&s[i]),s[i]+=s[i-1];
for (int i=1;i<=n;i++) f[i]=s[i]+i;
int l=1,r=1;dp[1]=0;
for (int i=1;i<=n;i++) {
while (l<r && slope(q[l],q[l+1])<=f[i]) l++;
dp[i]=dp[q[l]]+(f[i]-f[q[l]]-L)*(f[i]-f[q[l]]-L);
while (l<r && slope(q[r-1],q[r])>slope(q[r],i)) r--;
q[++r]=i;
}
printf("%lld",dp[n]);
return 0;
}

  

【bzoj1010】 HNOI2008—玩具装箱toy的更多相关文章

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

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

  2. bzoj1010: [HNOI2008]玩具装箱toy(DP+斜率优化)

    1010: [HNOI2008]玩具装箱toy 题目:传送门 题解: 很明显的一题动态规划... f[i]表示1~i的最小花费 那么方程也是显而易见的:f[i]=min(f[j]+(sum[i]-su ...

  3. [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)

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

  4. [bzoj1010](HNOI2008)玩具装箱toy(动态规划+斜率优化+单调队列)

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

  5. [BZOJ1010][HNOI2008]玩具装箱toy 解题报告

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

  6. BZOJ1010 [HNOI2008]玩具装箱toy

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  7. BZOJ1010 [HNOI2008]玩具装箱toy 动态规划 斜率优化

    原文链接http://www.cnblogs.com/zhouzhendong/p/8687797.html 题目传送门 - BZOJ1010 题意 一个数列$C$,然后把这个数列划分成若干段. 对于 ...

  8. 2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)

    传送门 一道经典的斜率优化dp. 推式子ing... 令f[i]表示装前i个玩具的最优代价. 然后用老套路. 我们只考虑把第j+1" role="presentation" ...

  9. 题解【bzoj1010 [HNOI2008]玩具装箱TOY】

    斜率优化动态规划可以用来解决这道题.同时这也是一道经典的斜率优化基础题. 分析:明显是动态规划.令\(dp[i]\)为前\(i\)个装箱的最小花费. 转移方程如下: \[dp[i]=\min\limi ...

  10. 【斜率优化】BZOJ1010 [HNOI2008]玩具装箱toy

    [题目大意] P教授有编号为1...N的N件玩具,第i件玩具长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.如果将第i件玩具到第j个玩具放到一 个容器中,那么容器的长度将为 x ...

随机推荐

  1. 《Ext JS模板与组件基本知识框架图----模板》

    最近在整理Ext JS的模板和组件,在参考<Ext JS权威指南>,<Ext JS Web应用程序开发指南>,<Ext JS API>等相关书籍后才写下这篇< ...

  2. 【JAVA并发编程实战】6、中断

    所谓的中断操作:它并不会真正地中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时刻中断自己. 调用一次interrupt中断请求,再次调用就是把中断状态恢复 1.响应中断 处理中断 ...

  3. eclipse js 报错解决办法

    最近项目中的js一直红叉叉,本人本来就是那种看见回收站有东西想清理的那种强迫症患者, 所以对于这种红叉叉更是心烦.这个我已经忍了好久了.今天 见这哥们犀利的解决了这个eclipes的bug.很是激动, ...

  4. 向上弹出菜单jQuery插件

    插件名:柯乐义英文名:Keleyijs文件名称:jquery.keleyi.js插件功能:该插件可以让你轻易地在页面上构建一个向上弹出的二级菜单. 示例查看:http://keleyi.com/kel ...

  5. AMD and CMD are dead之KMD.js版本0.0.2发布

    更新 正式从UglifyJS切换至UglifyJS2 增加依赖可视化功能 压缩代码更加方便 统一风格:如main的class名也不能省略 优化了kmdjs管道 修复了无数bug 通过src开启debu ...

  6. jQuery静态方法globalEval使用和源码分析

    Eval函数大家都很熟悉,但是globalEval方法却很少使用,大多数参考手册也没有相关api,下面就对其用法和源码相应介绍: jQuery.globalEval()函数用于全局性地执行一段Java ...

  7. iOS多线程之4.GCD简介

    GCD(Grand Central Dispatch)应该是我们开发中最常用到的多线程解决方案,是苹果公司专门为多核的并行运算提出的解决方案,是基于C语言的,提供了很多非常强大的函数. GCD的优势 ...

  8. Fragment配合RadioGroup实现点击切换布局

    这里用了 compile 'com.jakewharton:butterknife:7.0.1' compile 'org.greenrobot:eventbus:3.0.0' MainActivit ...

  9. Linux命令操作

    该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,就如同DOS下的copy命令一样,功能非常强大. 语法: cp [选项] 源文件或目录 目标文件或目录 说明:该命令把指定的源文件复制到目标文件 ...

  10. 微信小程序 - 开发指南

    一.下载并安装开发工具 下载地址 二.创建项目 打开开发工具 添加项目 进入预览和调试界面 代码编辑器 编译并预览 三.启动流程 四.适用场景 五.技术框架 六.科普 [图片较大 - 点击查看]