【bzoj1010】 HNOI2008—玩具装箱toy
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的更多相关文章
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 11893 Solved: 5061[Submit][S ...
- bzoj1010: [HNOI2008]玩具装箱toy(DP+斜率优化)
1010: [HNOI2008]玩具装箱toy 题目:传送门 题解: 很明显的一题动态规划... f[i]表示1~i的最小花费 那么方程也是显而易见的:f[i]=min(f[j]+(sum[i]-su ...
- [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- [bzoj1010](HNOI2008)玩具装箱toy(动态规划+斜率优化+单调队列)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有 的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...
- [BZOJ1010][HNOI2008]玩具装箱toy 解题报告
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- BZOJ1010 [HNOI2008]玩具装箱toy
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ1010 [HNOI2008]玩具装箱toy 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8687797.html 题目传送门 - BZOJ1010 题意 一个数列$C$,然后把这个数列划分成若干段. 对于 ...
- 2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)
传送门 一道经典的斜率优化dp. 推式子ing... 令f[i]表示装前i个玩具的最优代价. 然后用老套路. 我们只考虑把第j+1" role="presentation" ...
- 题解【bzoj1010 [HNOI2008]玩具装箱TOY】
斜率优化动态规划可以用来解决这道题.同时这也是一道经典的斜率优化基础题. 分析:明显是动态规划.令\(dp[i]\)为前\(i\)个装箱的最小花费. 转移方程如下: \[dp[i]=\min\limi ...
- 【斜率优化】BZOJ1010 [HNOI2008]玩具装箱toy
[题目大意] P教授有编号为1...N的N件玩具,第i件玩具长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.如果将第i件玩具到第j个玩具放到一 个容器中,那么容器的长度将为 x ...
随机推荐
- Entity Framework
Entity Framework 待整理.. 参考链接:http://www.cnblogs.com/lsxqw2004/archive/2015/08/07/4701979.html http:// ...
- Jar mismatch错误的解决
新建了一个项目,包含了两个库:appcompat_v7和swipelistview,结果出现了Jar mismatch错误: [2016-04-11 17:17:27 - MySwipeListVie ...
- 转载:《TypeScript 中文入门教程》 10、混入
版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 介绍 除了传统的面向对象继承方式,还流行一种通过可重用组件创建类的方式,就是联合另一个 ...
- Lock、ReentrantLock、synchronized、ReentrantReadWriteLock使用
先来看一段代码,实现如下打印效果: 1 2 A 3 4 B 5 6 C 7 8 D 9 10 E 11 12 F 13 14 G 15 16 H 17 18 I 19 20 J 21 22 K 23 ...
- Javascript 创建对象方法的总结
最近看了一下<Javascript高级程序设计(第三版)>,这本书很多人都推荐,我也再次郑重推荐一下.看过之后总得总结一下吧,于是我选了这么一个主题分享给大家. 使用Javascript创 ...
- Javascript对象
这次的分享,主要还是想跟大家聊聊Javascript语言中很重要的概念之一,对象.为什么说之一呢?因为Javascript其他重要概念还包括:作用域 作用域链 继承 闭包 函数 继承 数组 ..... ...
- Android打造属于自己的数据库操作类。
1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...
- 错误提示,解决方案java.lang.UnsatisfiedLinkError: Couldn't load easemobservice from loader dalvik.system.PathClassLoad
解决方案: 在libs下面创建一个armeabi-v7a文件夹 把armeabi *.so的文件复制一份 放在armeabi-v7a运行测试通过 关于 armeabi和armeabi-v7a 区别如下 ...
- native2ascii 使用说明
native2ascii.exe 是Java的一个文件转码工具,是将特殊各异的内容转为用指定的编码标准文体形式统一的表现出来,它通常位于JDK_home\bin目录下,安装好Java SE后,可在命令 ...
- .NET/ASP.NET MVC(模块化开发AraeRegistration)
阅读目录: 1.开篇介绍 2.AreaRegistration注册路由(传递路由上下文进行模块化注册) 1]开篇介绍 ASP.NET Routing 路由功能非常强大,设计的也很巧妙:如果说ASP.N ...