原文链接http://www.cnblogs.com/zhouzhendong/p/8687797.html

题目传送门 - BZOJ1010

题意

  一个数列$C$,然后把这个数列划分成若干段。

  对于数列$C$的某一段,是从$i$~$j$的,那么就会产生$(i-j+(\sum_{k=i}^j C_k)-L)^2$的花费。

  一种划分方式的花费就是划分出来的每一段产生的花费和。

  求所有不同的划分方式所产生的总花费中最小花费为多少。

  序列长度$\leq 5\times 10^4$。

题解

  看着好像斜率优化啊。

  恩对斜率优化,我们来推式子。

  记

  $dp_i$表示数列$C$的长度为$i$的前缀序列的最小花费。

  $sum_i=\sum_{j=1}^{i}C_j$

  $s_i=sum_i+i$

  于是我们很容易得到:

  $$dp_i=min\{dp_j+(s_i-s_j-1-L)^2\}(0\leq j<i)$$

  然后我们推一推式子。

  $$dp_j+(s_i-s_j-1-L)^2\\=dp_j+s_j^2+2(L+1)s_j-2s_is_j+si^2-2(L+1)s_i+(L+1)^2$$

  假设$j>k$,且选$j$优于选择$k$,则:

  $$dp_j+s_j^2+2(L+1)s_j-2s_is_j+si^2-2(L+1)s_i+(L+1)^2<dp_k+s_k^2+2(L+1)s_k-2s_is_k+si^2-2(L+1)s_i+(L+1)^2$$

  $$\Longrightarrow dp_j+s_j^2+2(L+1)s_j-2s_is_j<dp_k+s_k^2+2(L+1)s_k-2s_is_k$$

  令

  $$x_i=s_i$$

  $$y_i=dp_i+s_i^2+2(L+1)s_j$$

  $$dp_j+s_j^2+2(L+1)s_j-2s_is_j<dp_k+s_k^2+2(L+1)s_k-2s_is_k$$

  $$\Longrightarrow y_j-2s_ix_j<y_k-2s_ix_k$$

  $$\Longrightarrow \frac{y_j-y_k}{x_j-x_k}<2s_i$$

  注意由于开始限制了$j>k$所以$x_j-x_k>0$,所以最后两边同时相除不等式仍然成立。

  设

  $$g_{i,j}=\frac{y_i-y_j}{x_i-x_j}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (i>j)$$

  则上式可以表示为$g_{j,k}<2s_i$

  我们来发掘以下$g_{j,k}$的性质。

  1. 当$g_{j,k}\leq 2s_i$时,由于随着$i$变大,$2s_i$也变大,所以显然从$k$转移是永远不会比$j$好的,所以我们可以把$k$扔掉。

  2. 当$g_{i,j}\leq g_{j,k}$时,从$i$或者$k$转移至少有一个不比$j$差,所以可以把$j$扔掉。为什么??

    若$g_{i,j}\leq 2s_i$,显然$j$要被扔掉,根据第一个性质。

    若$g_{i,j}>2s_i$,则$g_{j,k}>2s_i$,那么显然$j$比$k$差,也得被扔掉。

  于是我们可以用一个单调队列来维护斜率的单调性。

  具体的:

  当情况1发生的时候让队首出队。

  在进队的时候,如果发生情况2,那么先让队尾出队,然后再进队。

  为了避免精度问题,我们可以把$x_i-x_j$乘上来。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=50005;
int n,q[N],head=1,tail=0;
LL L,s[N],dp[N],x[N],y[N];
int main(){scanf("%d%lld",&n,&L);for (int i=1;i<=n;i++)scanf("%lld",&s[i]),s[i]+=s[i-1]+1;q[++tail]=0;for (int i=1;i<=n;i++){int j=q[head+1],k=q[head];while (tail-head>0&&y[j]-y[k]<=2LL*s[i]*(x[j]-x[k]))head++,j=q[head+1],k=q[head];j=k;dp[i]=dp[j]+(s[i]-s[j]-L-1)*(s[i]-s[j]-L-1);x[i]=s[i];y[i]=dp[i]+s[i]*s[i]+2LL*(L+1)*s[i];j=q[tail],k=q[tail-1];while (tail-head>0&&(y[i]-y[j])*(x[j]-x[k])<=(y[j]-y[k])*(x[i]-x[j]))tail--,j=q[tail],k=q[tail-1];q[++tail]=i;}printf("%lld",dp[n]);return 0;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/BZOJ1010.html

BZOJ1010 [HNOI2008]玩具装箱toy 动态规划 斜率优化相关推荐

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

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

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

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

  3. BZOJ1010:[HNOI2008]玩具装箱TOY(斜率优化DP)

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

  4. [Bzoj1010][HNOI2008]玩具装箱toy(斜率优化)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1010 首先预处理前缀和sum[i],然后推出初始的dp方程,dp[i]表示装前i件物品的 ...

  5. BZOJ-1010 玩具装箱toy (斜率优化)

    题目大意:将n个数分成若干组,并且每组的数在原数组中应是连续的,每组会产生的代价为sum(i)-sum(j)+i-j-1-m,m为已知的常数.求最小代价. 题目分析:定义dp(i)表示将前 i 个元素 ...

  6. 1010 [HNOI2008]玩具装箱toy

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

  7. P3195 [HNOI2008]玩具装箱TOY

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

  8. [HNOI2008]玩具装箱toy

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

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

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

最新文章

  1. 作为一个程序员,数学对你到底有多重要(转)
  2. 微软(中国)CTO韦青:人工智能是拿来用的,不是拿来炒的
  3. NSIS 刷新ICO缓存
  4. Java开发程序员最值得学习的10大技术
  5. 关于积累-accumulation
  6. 基于U-net的肝脏肿瘤分割实战(Pytorch实现)
  7. 2018集训队日常训练1
  8. Discovering versions from the identity service failed when creating the password plugin.
  9. Linux字符界面和图形界面
  10. django model对象修改_从0到1搭建个人博客-Django(三)
  11. html数字增加动态效果,jQuery实现数字自动增加或者减少的动画效果示例_泠吢_前端开发者...
  12. php查询近期数据,thinkphp中如何查询当天,本周的,本月的,本年的数据
  13. Android音视频开发
  14. win10 VS2015社区版本 64位 TensorFlow 安装
  15. python 微信群发_用python写一个微信群发工具(基于itchat库)
  16. 2014年FME校园培训考核通过名单
  17. SystemC自带example的pipe研习
  18. linux cacti安装教程,Linux下Cacti安装与配置
  19. 安装ps显示计算机丢失adobe,win7系统安装PS显示检查许可证所需的adobe application manager丢失或损坏的解决方法...
  20. c语言自学听不懂,为什么C语言这么难学,怎么才能学好呢?

热门文章

  1. uboot启动流程概述_Alibaba Cloud Linux 2 LTS OS 启动优化实践
  2. linux如何格式化u盘并挂载,Linux下 格式化U盘和挂载
  3. 一段java并发编程代码
  4. 实训说明书 在线音乐平台项目规格说明书
  5. 解读MySQL 8.0新特性:Skip Scan Range
  6. STRUTS模拟试题
  7. 【slighttpd】基于lighttpd架构的Server项目实战(7)—http-parser
  8. python简单连接数据库
  9. python科学计算笔记(十三)pandas的merge、concat合并数据集
  10. 阿里 Re-rank Recommendation 读后感