洛谷P3195 玩具装箱TOY
题目大意:
有n个数,要将他们分成若干段,每一段的cost定义为: cost=r-l+ΣCk (k∈[r,l]) 该段的最终花费是:(cost-L)^2; 给出L,n,C(1~n),总共的最小花费。
分析:
dp方程极容易想出来: f[i]=max(f[j]+(sum[i]-sum[j]+i-j-1-L)^2) 其中sum[i]表示c(1~i)的和。因为取的这一段数从j+1开始,所以i-j-1(题目中i-j并不是区间长度!没有再加1)
O(n^2)直接挂掉。
因为状态O(n)已经非常不错,无法再优化了。所以考虑能不能优化转移的O(n)。
将表达式展开:
f[i]=f[j]+(sum[i]-sum[j]+i-j-1-L)^2
令a[k]=sum[k]+k;x[k]=a[k]+1+ f[i]=f[j]+(a[i]-x[j])^2
f[i]=f[j]+x[j]^2-2a[i]x[j]+a[i]^2
对于给定的i,a[i]^2是一个定值,所以当做常数先不用管,但是记得最后加上!
令y[k]=f[k]+x[k]^2; f[i]=y[j]-2a[i]x[j]
移项: y[j]=2a[i]x[j]+f[i]
对于给定的i,我们需要循环所有的j。 对于一个j,我们已经知道了x[j],y[j]。 将它看作一个点,所有的j构成一个点集,横坐标x[j],纵坐标y[j]
而对于给定的i,2a[i]是一个定值,看做斜率,而目标f[i]则是截距,所以要在j的点集之中找到一个点使得这条直线截距最小,本质是将y=2a[i]x的直线平移。
可以发现这些最优解的点必定在边界上。并且发现,斜率是单增的,而x一定也是单增的。所以可以维护一个左上下凸壳。
因为斜率单增,所以若一个点此时不是最优解,那么以后一定也不是最优解,可以直接从头pass掉;每次新增一个点,都要保证这是一个凸包,通过斜率要来从尾pass掉。
所以可以用单调队列维护!单调,在这里是指队列中的元素,每相邻两个元素所代表的点连成的线,其斜率是单调递增的。因为斜率都是正数,所以也就是画出来是一个左上凸包。
注意,队列中至少要有一个0号元素不能出队!这里第一个空位置是有意义的。否则就不存在线和斜率了。所以手写队列时,开始hd=tl=0,while判断中hd<tl 保证一定至少有一个元素,并且这个元素不会被其他元素替代。详见代码。
具体步骤:
1.前缀和预处理
2.循环i,先删除队首,再更新答案,再更新队列。
3.输出f[n] GAME OVER
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=+;
int n,L;
long long f[N];
long long sum[N];
int q[N],hd,tl;
long long a(int i)
{
return sum[i]+i;
}
long long x(int i)
{
return sum[i]+i+L+;
}
long long y(int i)
{
return x(i)*x(i)+f[i];
}
double slope(int a,int b)
{
return ((double)y(b)-y(a))/((double)x(b)-x(a));
}//一堆函数
int t;
int main()
{
scanf("%d%d",&n,&L);
for(int i=;i<=n;i++)
{
scanf("%d",&t);
sum[i]=sum[i-]+t;
}
hd=,tl=;
for(int i=;i<=n;i++)
{
while(hd<tl&&slope(q[hd],q[hd+])<*a(i)) hd++;//删除
f[i]=y(q[hd])-*a(i)*x(q[hd])+a(i)*a(i);
while(hd<tl&&slope(q[tl-],q[tl])>slope(q[tl-],i)) tl--;
q[++tl]=i;//更新
}
printf("%lld",f[n]);
return ;
}
总结:
1.一个题能用斜率优化,必然能出现y=kx+b 线性形式,其中k是定值,x,y构成点集,b是目标值。
2.一个凸包能用单调队列优化的条件应该满足:
(1)查询的斜率单调 (2)插入的点横坐标有单调性 (否则要用平衡树、set)
洛谷P3195 玩具装箱TOY的更多相关文章
- 洛谷P3195 玩具装箱
P3195 [HNOI2008]玩具装箱TOY 第一道斜率优化题. 首先一个基本的状态转移方程是 要使f[i]最小,即b最小. 对于每个j,可以表示为一个点. 然后我们取固定斜率时截距最小的即可,高中 ...
- 洛谷P3195||bzoj1010 [HNOI2008]玩具装箱TOY
洛谷P3195 bzoj1010 设s数组为C的前缀和 首先$ans_i=min_{j<i}\{ans_j+(i-j-1+s_i-s_j-L)^2\}$ (斜率优化dp)参考(复读)https: ...
- 斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy
本文为原创??? 作者写这篇文章的时候刚刚初一毕业…… 如有错误请各位大佬指正 从例题入手 洛谷P3915[HNOI2008]玩具装箱toy Step0:读题 Q:暴力? 如果您学习过dp 不难推出d ...
- 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教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆, ...
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
- 【BZOJ-1010】玩具装箱toy DP + 斜率优化
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8432 Solved: 3338[Submit][St ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...
- 【BZOJ】【1010】【HNOI2008】玩具装箱Toy
DP/斜率优化 根据题目描述很容易列出动规方程:$$ f[i]=min\{ f[j]+(s[i]-s[j]+i-j-1-L)^2 \}$$ 其中 $$s[i]=\sum_{k=1}^{i} c[k] ...
随机推荐
- FreeRTOS 任务与调度器(2)
在上一篇我们介绍了FreeRTOS任务的一些基本操作和功能,今天我们会介绍一个很好很强大的功能——任务通知 任务通知可以在不同任务之间传递信息,它可以取代二值信号量.计数信号量.事件标志组.深度为1的 ...
- Dubbo(四) Dubbo-Admin项目 Dubbo管理台
前言 在dubbo项目中,有注册中心,消费者,提供者就足以构成一个完整的项目了.但是仅仅有这三个角色,很难对整个项目状态有直观的了解,以及对项目操作. 因此早有前辈对此原因作出了贡献——一个通用的du ...
- SC1243sensor噪点问题调试
接手一块SC1243sensor的板子调试,仔细核对了原理图和PCB发现,PCB不是很好,电源处理不够好,但是出图了,问题是有噪点,麻点,根据经验要求软件修改了PCLK的极性噪点消失,问题解决. 1: ...
- Aop笔记
参考: https://blog.csdn.net/bombSKLK/article/details/79143145 示例 拦截的 注解的方法 @Around("@annotation(c ...
- 如何用chrome查看post get及返回的数据
chrome浏览器按下F12打开开发者工具 点击Network,找到过滤器 筛选XHR,Method那一列会显示POST GET:
- PHP输入流 php://input 相关【转】
为什么xml_rpc服务端读取数据都是通过file_get_contents(‘php://input', ‘r').而不是从$_POST中读取,正是因为xml_rpc数据规格是xml,它的Conte ...
- Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)
Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...
- HTTP基础与Android之(安卓与服务器通信)——使用HttpClient和HttpURLConnection
查看原文:http://blog.csdn.net/sinat_29912455/article/details/51122286 1客户端连接服务器实现内部的原理 GET方式和POST方式的差别 H ...
- BugPhobia进阶篇章:功能规格说明书
0x01 :特别鸣谢 首先特别鸣谢<构建之法>中并没有给出固定化格式的功能规格说明书的样例,因此在此次的说明书中将尽可能用生动形象的例子展示软件交互阐释 因此受到它本身的启发,此次团队功能 ...
- ASP.NET Forms验证
/// <summary> /// 执行用户登录操作 /// </summary> /// <param name="config">授权配置信 ...