DP/斜率优化


  根据题目描述很容易列出动规方程:$$ f[i]=min\{ f[j]+(s[i]-s[j]+i-j-1-L)^2 \}$$

  其中 $$s[i]=\sum_{k=1}^{i} c[k] $$

  而$x$即为$s[i]-s[j]+i-j-1$

  这个$x$的表示实在太不好看,我们容易发现$i-j$其实是可以跟$s[i]-s[j]$合到一起的,即令 $c[i]=c[i]+1$,则$s[i]=\sum_{k=1}^{i} (c[i]+1)=\sum_{k=1}^{i}c[i]+i $,所以$x=s[i]-s[j]-1$。再将那个$-1$与$L$合并,即$L=L+1$,然后我们就得到整理后的方程:$$ f[i]=min\{ f[j]+(s[i]-s[j]-L)^2 \} $$

  证明决策单调性:$( j > k )$

\[ \begin{aligned} f[j]+(s[i]-s[j]-L)^2 &< f[k]+(s[i]-s[k]-L)^2 \\ f[j]-f[k]+(s[j]^2-s[k]^2) &< 2*(s[i]-L)*(s[j]-s[k]) \\ \frac{ f[j]-f[k]+(s[j]^2-s[k]^2) }{ 2*(s[j]-s[k]) } &< s[i]-L \end{aligned} \]

  这里将 $s[i]-L$ 当作一个整体来计算

 1 /**************************************************************
 2     Problem: 1010
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:132 ms
 7     Memory:2640 kb
 8 ****************************************************************/
 9
10 //BZOJ 1010
11 #include<cmath>
12 #include<vector>
13 #include<cstdio>
14 #include<cstring>
15 #include<cstdlib>
16 #include<iostream>
17 #include<algorithm>
18 #define rep(i,n) for(int i=0;i<n;++i)
19 #define F(i,j,n) for(int i=j;i<=n;++i)
20 #define D(i,j,n) for(int i=j;i>=n;--i)
21 #define pb push_back
22 using namespace std;
23 int getint(){
24     int v=0,sign=1; char ch=getchar();
25     while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();}
26     while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();}
27     return v*=sign;
28 }
29 const int N=50010;
30 typedef long long LL;
31 /******************tamplate*********************/
32 LL c[N],s[N],f[N];
33 int q[N],l,r;
34 double slop(int k,int j){
35     return double(f[j]+s[j]*s[j]-f[k]-s[k]*s[k])/
36         double(2*(s[j]-s[k]));
37 }
38 int main(){
39     int n=getint(),L=getint()+1;
40     F(i,1,n){
41         c[i]=getint()+1;
42         s[i]=s[i-1]+c[i];
43     }
44     F(i,1,n){
45         while(l<r && slop(q[l],q[l+1])<s[i]-L) l++;
46         int t=q[l];
47         f[i]=f[t]+(s[i]-s[t]-L)*(s[i]-s[t]-L);
48         while(l<r && slop(q[r-1],q[r])>slop(q[r],i))r--;
49         q[++r]=i;
50     }
51     printf("%lld\n",f[n]);
52     return 0;
53 }

View Code

1010: [HNOI2008]玩具装箱toy

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 7156  Solved: 2714
[Submit][Status][Discuss]

Description

P 教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维 容器中。P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。 同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度 将为 x=j-i+Sigma(Ck) i<=K<=j 制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。P教授不关心容器的数目,他可以制作 出任意长度的容器,甚至超过L。但他希望费用最小.

Input

第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7

Output

输出最小费用

Sample Input

5 4
3
4
2
1
4

Sample Output

1

HINT

Source

[Submit][Status][Discuss]

转载于:https://www.cnblogs.com/Tunix/p/4332984.html

【BZOJ】【1010】【HNOI2008】玩具装箱Toy相关推荐

  1. bzoj 1010: [HNOI2008]玩具装箱toy 2011-12-27

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2254  Solved: 744 [Submit][S ...

  2. bzoj 1010: [HNOI2008]玩具装箱toy(斜率dp)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 10837  Solved: 4513 [Submit] ...

  3. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化dp

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  4. 1010 [HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Description P教授要去看奥运,但是他舍不下他的玩具,于是他决 ...

  5. [HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 10286  Solved: 4215 [Submit] ...

  6. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 11893  Solved: 5061 [Submit] ...

  7. P3195 [HNOI2008]玩具装箱TOY

    P3195 [HNOI2008]玩具装箱TOY 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的 ...

  8. AC日记——[HNOI2008]玩具装箱toy bzoj 1010

    1010 思路: 斜率优化DP: 跪烂大佬 代码: #include <bits/stdc++.h> using namespace std; #define maxn 50005 #de ...

  9. P3195 [HNOI2008]玩具装箱TOY(斜率优化)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为 1\cdots N1 ...

  10. 洛谷P3195 [HNOI2008]玩具装箱TOY

    题目:https://www.luogu.org/problemnew/show/P3195 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 ...

最新文章

  1. Altium Designer唤出关掉的窗口
  2. Docker源码分析(三):Docker Daemon启动
  3. YII中session和cookie
  4. 硬盘安装Linux救援系统,硬盘安装linux系统
  5. Kylin开启Kerberos安全认证
  6. aop源码分析之 —— 创建代理对象
  7. 基于JAVA+Swing+MYSQL的在线订餐管理系统
  8. python网页提交表单_使用Python中的POST请求通过网站表单上传基本文件
  9. Ghost本地安装highlight.js使代码高亮
  10. 首届 “女生科技体验节” 大爆料!
  11. Hadoop1重新格式化HDFS
  12. android模拟键盘自动输入,Android测试教程5--模拟键盘输入
  13. 如何撰写优秀的谷歌AD广告标题?
  14. JAVA-CPU飙高问题排查
  15. 技嘉显卡性能测试软件,显卡性能与超频:性能高于公版,超频潜力可圈可点
  16. oracle 按时间每五分钟分割,Oracle 5分钟或30分钟分割方法
  17. 文本域换行 php,js获取textarea文本域自动换行符
  18. 密码学之RSA加密原理解析
  19. 使用虚拟机备份软件备份OpenStack虚拟机
  20. foxmail登入密码忘记怎么办?

热门文章

  1. ubuntu安装labelme
  2. R-CNN学习笔记2:Rich feature hierarchies for accurate object detection and semantic segmentation
  3. python实现将字符串转化为数字(逆序输出)
  4. python求解LeetCode习题Compare Version Numbers
  5. 人人都想自学python_人人都想自学Python,为什么坚持下来的没几个?
  6. cuda无法在你的电脑上运行_解决“此应用无法在你的电脑上运行”
  7. python安装换源_Python切换pip安装源的方法详解
  8. linux shell grep 多个文件
  9. 计算机环境变量win10,Win10系统path环境变量怎么设置
  10. shell倒数第三位增加字符_shell中常用的变量处理、字符串操作(之三)