题意:

  有n个玩具,要将它们分为若干组,玩具长度C可能不同。给出n个玩具的摆放顺序,连续的任意多个玩具都可以成为一组。区间[i,j]成为一组的费用是cost=(j-i+Sigma(Ck)-L)2且i<=k<=j。给定n和L和每个玩具的长度,问分组后费用总和是多少? (n<=5*104)。

思路:

  转移方程:dp[i]=min( dp[j]+(sum[i]-sum[j]+i-j+1-L)2  )。sum[i]表示前i件玩具长度的总和,0<j<i,(i-j+1)表示与i同组的玩具个数。

  根据方程是可以推出这题是满足决策单调性的。以下是抄来的证明,稍微修改:

  令f[i]=sum[i]+i, c=1+L,则dp[i]=min( dp[j]+(f[i]-f[j]-c)2  )

  1.证明决策单调性

  假设在状态i处的k决策优于j决策,且j<k,那么 dp[k]+(f[i]-f[k]-c)2<=dp[j]+(f[i]-dp[j]-c)2

  而对于i后面的某个状态t,设f[t]=f[i]+v,先不管v是多少。

  要证明:dp[k]+(f[t]-f[k]-c)2<=dp[j]+(f[t]-f[j]-c)2

  只要证(将f[t]=f[i]+v代入):dp[k]+(f[i]+v-f[k]-c)2<=dp[j]+(f[i]+v-f[j]-c)2

  只要证dp[k]+(f[i]-f[k]-c)2+2v*(f[i]-f[k]-c)+v2  <=  dp[j]+(f[i]-f[j]-c)2+2v*(f[i]-f[j]-c)+v2

  由于假设,所以只要证: 2v*(f[i]-f[k]-c)<=2v*(f[i]-f[j]-c)。

  即证:f[k]>=f[j](显然)

  证明完毕

  思路很明确,一直卡在二分上面,噗。

  用一个队列来维护这些区间段,由于区间段必定是连在一起的,所以只需要记录左端点L以及更新这个区间的决策k。如果队列为空,则后面全部由i来更新得到,若非空,那么判断队尾的L,是否由i来更新会更优,若是,则pop掉队尾,继续同样的动作,直到队列为空或者i作为决策不如队尾的L更好,那么i可以更新的就是[L,n]之中的尾部区间[r,n],而r可以用二分查找的方式。细节上很容易写挫,比如i决策可能完全都可以用武之地,不用二分去找了,否则会错;二分时必定要保证r由i来更新更佳,且有可能会出现等于的情况。复杂度O(nlogn),斜率优化等再写。

  1. //#include <bits/stdc++.h>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <set>
  7. #include <deque>
  8. #include <map>
  9. #include <algorithm>
  10. #include <vector>
  11. #include <iostream>
  12. #define pii pair<int,int>
  13. #define back que[rear-1]
  14. #define INF 0x7f7f7f7f
  15. #define LL long long
  16. #define ULL unsigned long long
  17. using namespace std;
  18. const double PI = acos(-1.0);
  19. const int N=;
  20.  
  21. LL len[N], dp[N], L;
  22. int q[N], d[N], n, l, r; //区间以及决策
  23. LL cost(int j,int i) //用j来更新i的费用
  24. {
  25. return dp[j]+(len[i]-len[j]-L)*(len[i]-len[j]-L);
  26. }
  27.  
  28. int find(int i,int k,int st)
  29. {
  30. int ll=st, rr=n;
  31. while(ll<rr)
  32. {
  33. int mid=rr-(rr-ll+)/;
  34. if( cost(i,mid)<cost(k,mid)) rr=mid;
  35. else ll=mid+;
  36. }
  37. return rr;
  38. }
  39. LL cal()
  40. {
  41. l=r=;
  42. d[]=;q[]=; //初始时,0可以更新[1,n]
  43. for(int i=; i<=n; i++)
  44. {
  45. dp[i]=cost(d[l], q[l]++); //q[l]永远等于i
  46. if( l<r && q[l]==q[l+] ) l++;
  47.  
  48. while( l<=r && cost(i,q[r])<cost(d[r],q[r]) ) r--;
  49. if(l>r) //只能用i来更新
  50. {
  51. q[++r]=i+;
  52. d[r]=i;
  53. }
  54. else if( cost(i,n)<cost(d[r],n))
  55. {
  56. int tmp=find(i, d[r], q[r]);
  57. q[++r]=tmp;
  58. d[r]=i;
  59. }
  60. }
  61. return dp[n];
  62. }
  63.  
  64. int main()
  65. {
  66. //freopen("input.txt","r",stdin);
  67. while(~scanf("%d%lld",&n,&L))
  68. {
  69. L++;len[]=;
  70. for(int i=; i<=n; i++)
  71. {
  72. scanf("%lld",&len[i]);
  73. len[i]+=len[i-];
  74. }
  75. for(int i=; i<=n; i++) len[i]+=i;
  76. printf("%lld\n", cal() );
  77. }
  78. return ;
  79. }

AC代码

HYSBZ 1010 玩具装箱toy (决策单调DP)的更多相关文章

  1. BZOJ 1010: 玩具装箱toy (斜率优化dp)

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

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

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  3. 『玩具装箱TOY 斜率优化DP』

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

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

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

  5. BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

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

  6. BZOJ 1010 玩具装箱toy(斜率优化DP)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题目大意:P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他 ...

  7. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

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

  8. bzoj 1010 玩具装箱toy -斜率优化

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

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

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

随机推荐

  1. Linux命令总结_sort排序命令

    1.sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式: sort [-bcfMnrtk][源文件][-o 输出文件]       补充说明:sort可针对文本文件的内容,以行为单位 ...

  2. [hiho1586]Minimum

    题意:区间内乘积最小值,带修改.解题关键:线段树裸题,考场上以为x y必须不等,还维护了次小值,尼玛嗨尼玛嗨,划水一整场,心态爆炸. 注意坐标需要+1 #include<cstdio> # ...

  3. PCL中有哪些可用的PointT类型(5)

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=270 Narf36 - float x, y, z, roll, pitch ...

  4. Ubuntu如何锁定分辨率

    终于把Ubuntu的虚拟机装好了,但是分辨率没有1920*1080是什么鬼啊? 下面详细讲一下如何设置1920*1080的分辨率并设置,主要都是照着前辈的博客自己在操作一遍熟悉一下,嘿嘿. 1.安装v ...

  5. The web.config file for this project is missing the required DirectRequestModule.

    The web.config file for this project is missing the required DirectRequestModule.   将应用程序集的模式由集成改为经典 ...

  6. JAVA企业级开发-jdbc入门(09)

    一. jdbc介绍 JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JD ...

  7. MYSQL数据库设计规范11111

    MYSQL数据库设计规范       1.数据库命名规范         采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成;         命名简洁明确(长度不能超 ...

  8. 【Unity】物理碰撞实验

    http://www.cnblogs.com/javawebsoa/archive/2013/05/18/3085818.html 这几天为了准备面试,所以决定对平时学习中的盲点扫盲一下,首先想到的就 ...

  9. Unity脚本引用原理,修复Unity脚本引用丢失,源码脚本与dll中的脚本引用互换 .

    http://blog.csdn.net/gz_huangzl/article/details/52486509 前言 在我们开发游戏的过程中,经常会碰到脚本引用丢失的情况,但是怎么把它们修复到我们的 ...

  10. php 数值转多少年,多少天,多少时,多少分,多少秒

    function Sec2Time($time){ if(is_numeric($time)){ $value = array( "years" => 0, "da ...