【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 ...
随机推荐
- Xamarin 免费了,你能做什么?
3月底,微软正式宣布:Xamarin免费了!那么,你能做什么? 抢先一步,用Xuni助力你的Xamarin开发! Xamarin是什么 Xamarin含Xamarin.Andoid,Xamarin.i ...
- UVALive 6911---Double Swords(贪心+树状数组(或集合))
题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- Java新人学习(li)
一.项目中搭配使用SVN和Git 安装SVN:安装熟悉Git:安装maven,修改setting.xml文件:安装eclipse,配置jdk.maven路径: 建立自己的Git仓库,熟悉常用的Git命 ...
- [moka同学笔记]关于api-ms-win-crt-runtimel1-1-0.dll缺失
在搞mongodb时候,碰到了这个坑.[api-ms-win-crt-runtimel1-1-0.dll缺失],懵逼不知道怎么改,从同事电脑里拷贝了这个文件,也按照网上的办法改了,改了半天还是不行.最 ...
- JavaScript高阶函数
所谓高阶函数(higher-order function) 就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数. 下面的例子接收两个函数f()和g(),并返回一个新的函数用以计算f(g ...
- thinkcmf 常用操作
11-16 thinkcmf 核心文件结构:simplewind--model--lite--model.class.php /controller.class.php Mobile---contr ...
- 用html5的canvas画布绘制贝塞尔曲线
查看效果:http://keleyi.com/keleyi/phtml/html5/7.htm 完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...
- javascript俄罗斯方块游戏
在线试玩:http://keleyi.com/game/5/ 操作指南:键盘方向键←→控制左右移动,↑键变形,↓键快速下落. 别看这段js代码只有短短的100多行,效果却非常不错,用键盘的方向键操作, ...
- 1-1 gulp 实战
npm install gulp-htmlmin gulp-imagemin imagemin-pngcrush gulp-minify-css gulp-jshint gulp-uglify gul ...
- 服务器重启后导致访问ArcServer地图服务须登录
问题状况: 重启服务器后,在访问网站的地图服务时会提示登录,输入各种密码账号都不好用 解决方法: 通过进入[服务管理器],找到ArcGISServer的服务,重新启动该服务就可以.