P3195 [HNOI2008]玩具装箱TOY
列出DP方程式:设f[i]表示分组完前i件物品的最小花费,为方便计算,
设sum[i]表示是前i件物品的长度和。
f[i]=min(f[j]+(sum[i]-sum[j]+i-j-L-1)^2) [0<=j<i]
求复杂度O(n)的解法
斜率优化入门题
对于这类方程f(i)=a(i)*b(j)+a(i)+b(j)
工具:构造直线,单调队列
令a(i)=sum(i)+i, b(j)=sum(j)+j+L+1
f(i)=f(j)+(a(i)-b(j))^2
=f(j)+a(i)^2-2*a(i)*b(j)+b(j)^2
2*a(i)*b(j)+f(i)-a(i)^2=f(j)+b(j)^2
//以j为变量,i为常量来看
坐标角度来讲,f(i)含义为:斜率为k=2*a(i)的直线过点P(b(j),f(j)+b(j)^2)与y轴的截距加上a(i)^2
即求这个截距的最小值
结合图像
存在单调队列的最优的 P 点(图中用直线连接)组成了一个下凸包
几点说明:
1.随着i增加,目标斜率k=2*a(i)也在增加(sum(i)是前缀和)
2.目标坐标点为直线与凸包刚好相切的点,即slope(Pj,Pj+1)下面的斜率都小于k,上面斜率都大于k
单调队列:
对队首:while(slope(Phead,Phead+1)<2*a(i))head++; //把前面不要的都剪掉
筛选出来的q(head)即为最优解
f(i)=f(q(head))+(a(i)-b(q(head))^2
对队尾:while(slope(Ptail-1,Ptail)<slope(Ptail-1,Pi))tail--;q(++tail)=i;//如果新加入的Pi与Ptail-1的斜率更小,那么就替换掉Ptail
上代码:
inline db a(int i){return sum(i)+i;}
inline db b(int i){return a(i)+L+1;}
inline db X(int i){return b(i);}
inline db Y(int i){return f(i)+b(i)*b(i);}
inline db slope(int i,j){return (Y(i)-Y(j))/(X(i)-X(j));}
head=tail=1;
For(i,1,n){
while(head<tail&&slope(q(head),q(head+1))<2*a(i))head++;
f(i)=f(q(head))+(a(i)-b(q(head))*(a(i)-b(q(head));
whiel(slope(q(tail-1),q(tail))>slope(q(tail-1),i))tail--;
q(++tail)=i;
}
cout<<f(n);
P3195 [HNOI2008]玩具装箱TOY的更多相关文章
- P3195 [HNOI2008]玩具装箱TOY(斜率优化dp)
P3195 [HNOI2008]玩具装箱TOY 设前缀和为$s[i]$ 那么显然可以得出方程 $f[i]=f[j]+(s[i]-s[j]+i-j-L-1)^{2}$ 换下顺序 $f[i]=f[j]+( ...
- [luogu P3195] [HNOI2008]玩具装箱TOY
[luogu P3195] [HNOI2008]玩具装箱TOY 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆, ...
- P3195 [HNOI2008]玩具装箱TOY 斜率优化dp
传送门:https://www.luogu.org/problem/P3195 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP
题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- [洛谷P3195][HNOI2008]玩具装箱TOY
题目大意:有n个物体,大小为$c_i$.把第i个到第j个放到一起,容器的长度为$x=j-i+\sum\limits_{k-i}^{j} c_k$,若长度为x,费用为$(x-L)^2$.费用最小. 题解 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...
- 洛谷 P3195 [HNOI2008]玩具装箱TOY
题意简述 有n个物体,第i个长度为ci 将n个物体分为若干组,每组必须连续 如果把i到j的物品分到一组,则该组长度为 \( j - i + \sum\limits_{k = i}^{j}ck \) 求 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
随机推荐
- PHP trick(代码审计关注点)
随着代码安全的普及,越来越多的开发人员知道了如何防御sqli.xss等与语言无关的漏洞,但是对于和开发语言本身相关的一些漏洞和缺陷却知之甚少,于是这些点也就是我们在Code audit的时候的重点关注 ...
- 【学习笔记】--- 老男孩学Python,day5 列表 元祖
今日主要内容1. list(增删改查) 列表可以装大量的数据. 不限制数据类型. 表示方式:[] 方括号中的每一项用逗号隔开 列表和字符串一样.也有索引和切片 常用的功能: 1. 增: append( ...
- PDO中的事务处理
基本原理和步骤其实都是一样的(可参看上一篇“MySQL的事务处理”),PDO中的事务处理就是调用PDO对象的三个方法: 开启事务:beginTransaction 回滚操作:rollBack 执行操作 ...
- <Android 基础(三十五)> RecyclerView多类型Item的正确实现姿势
简介 RecyclerView是我们开发过程中经常使用到的一个元素,原生的RecyclerView.Adapter基本上可以满足一般的需求,关于RecyclerView的基础介绍请移步: Recycl ...
- php用smarty来做简易留言系统,明细步骤简单操作
留言信息是之前用php做过的一个例子,现在把它用smarty模板来做 大概是这样子 点击发布信息 然后填写内容,发送后会返回表格,写的内容都会出现在表格里 数据库的数据是这样的: 先建两个文件.php ...
- Nginx基本的安全优化
为了防止nginx出现软件漏洞,我们要对nginx软件服务加强一些安全性,下面就介绍一下基本的安全优化 1.隐藏nginx版本号: 想要隐藏,首先我们要了解所使用软件的版本号,我们可以在Linux中查 ...
- 语义SLAM的数据关联和语义定位(二)Semantic Localization Via the Matrix Permanent
论文假设和单目标模型 这部分想讲一下Semantic Localization Via the Matrix Permanent这篇文章的一些假设. 待求解的问题可以描述为 假设从姿态\(x\)看到的 ...
- 【Python】多线程
import threading import time class myThread (threading.Thread): #继承父类threading.Thread def __init__(s ...
- MySQL出现Waiting for table metadata lock的场景浅析
MySQL版本为5.6.12. 在进行alter table操作时,有时会出现Waiting for table metadata lock的等待场景.而且,一旦alter table TableA的 ...
- Resource View Window of Visual Studio
https://msdn.microsoft.com/en-us/library/d4cfawwc.aspx For the latest documentation on Visual Studio ...