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 ...
随机推荐
- HDU6188
Duizi and Shunzi Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU4283(KB22-G)
You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 【 js 基础 】【 源码学习 】柯里化和箭头函数
最近在看 redux 的源码,代码结构很简单,主要就是6个文件,其中 index.js 负责将剩余5个文件中定义的方法 export 出来,其他5个文件各自负责一个方法的实现. 大部分代码比较简单,很 ...
- 学习笔记(4)——实验室集群管理结点IP配置
经过验证,集群管理结点mgt的IP配置应为如下所示: [root@mgt zmq]# ifconfig//外部网卡 eth0 Link encap:Ethernet HWaddr 5C:F3:FC:E ...
- SpringBoot2+WebSocket之聊天应用实战(优化版本)
背景 之前再SpringBoot2.0集成WebSocket,实现后台向前端推送信息中已经进行过一次demo,而这次的demo更加明确,优化了相关代码,为IM而生 前提 前提当然是导入相关的包,以及配 ...
- Django Forms实例
# Django的Form主要具有一下几大功能: # # 生成HTML标签 # 验证用户数据(显示错误信息) # HTML Form提交保留上次提交数据 # 初始化页面显示内容 # forms组件生成 ...
- sql server 存储过程的学习
存储过程学习笔记 存储过程就是一条或者多条sql语句的集合,为了实现特定任务,而将一些需要多次调用的固定操作语句编写成程序段,这些程序段存储在服务器上,有数据库服务器通过程序来调用.T_SQL:存储过 ...
- 迁移MSSQL实例的所有login(包含密码)
迁移数据库的时候肯定会涉及到login的迁移(包含数据库除外). 而一般我们迁移login的时候,可能会使用在某个login上右键生成脚本这样的做法.但是这样生成的脚本不能把密码也生成出来. 而且你只 ...
- Redis集群迁移
1:开发中断程序,登录各个主节点查看key信息 INFO # Keyspace db0:keys,expires,avg_ttl # Keyspace db0:keys,expires,avg_ttl ...
- PostgreSQL数据加载工具之pg_bulkload
1. 介绍 PostgreSQL提供了一个copy命令的便利数据加载工具,copy命令源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.pg_bulkload ...