题意:

  给出一个序列 {a[i]} 把其分成若干个区间,每个区间的价值为 W = (j − i + ∑ak(i<=k<=j) - L)​,求所有分割方案中价值之和的最小值。

细节:

  仔细看数据范围:1 <= N <= 50000 ,1 <= C[i] <= 10^7,所以不忘记开Long Long / Int64,咳咳我很关心 Pascal 选手。

分析:

  显然一题划分区间求最值的题目,所以可以用动态规划解决,联想一下状态:f[i] 表示以 i 为结尾且以 i 为断点的最小价值和。

  考虑到 i 是断点的问题所以对于后面的状态,新的一段区间是不包括 i 的,所以我们可以开始转移了:f[i] = min { f[j] + (sum[i] - sum[j] + i - (j + 1) - L)2 }

  得到了一个 1D/1D 的动规方程,对于这一类式子我们一般考虑优化转移,显然状态无法进行优化,不然思想转变成了贪心,显然局部最有不满足全局最有,我们可以尝试是否存在在转移时的无用状态,所谓无用状态是一些不优的状态,我们显然可以选择最有的状态进行转移,其满足最有字结构的性质。

  不妨令 j1 < j2 < i,且 j1 的转移不必 j2 优,从中我们可以发现不需要去求解 j1 直接从 j2 进行转移不会影响答案,且能够节省时间。

  所以我们可以得到式子 f[j2] + (sum[i] - sum[j2] + i - (j2 + 1) - L)2 <= f[j1] + (sum[i] - sum[j1] + i - (j1 + 1) - L)2,由于式子过于复杂我们考虑换元。

  不妨再令 a[i] = sum[i] - L + i - 1,b[i] = sum[i] + i

  所以式子转换成:f[j2] + ( a[i] - b[j2] )<= f[j1] + ( a[i] - b[j1] )2

  最后可得:f[j2]+ b[j2]-f[j1]-b[j1]2 <= 2 × a[i] ×( b[j2] - b[j1] ) 所以此时我们可以考虑斜率优化具体的分析请详见一下本人博客

代码:

本人压行怪物请见谅:

#include<bits/stdc++.h>
#define MAXN 50010
#define LL long long
using namespace std; LL f[MAXN], sum[MAXN], a[MAXN], b[MAXN];
int n, L, que[MAXN]; int main(){
scanf("%d%d", &n, &L);
for (int i=; i<=n; i++){
LL x;
scanf("%lld", &x);
sum[i]=sum[i-]+x;
}
for (int i=; i<=n; i++) a[i]=sum[i]+i--L, b[i]=sum[i]+i;
int head=, tail=;
for (int i=; i<=n; i++){
while (head<tail && *a[i]*(b[que[head+]]-b[que[head]])>=f[que[head+]]-f[que[head]]+b[que[head+]]*b[que[head+]]-b[que[head]]*b[que[head]]) ++head;
f[i]=f[que[head]]+(a[i]-b[que[head]])*(a[i]-b[que[head]]);
while (head<tail && (f[que[tail]]+b[que[tail]]*b[que[tail]]-f[que[tail-]]-b[que[tail-]]*b[que[tail-]])*(b[i]-b[que[tail]])>=(f[i]+b[i]*b[i]-f[que[tail]]-b[que[tail]]*b[que[tail]])*(b[que[tail]]-b[que[tail-]])) --tail;
que[++tail]=i;
}
printf("%lld\n", f[n]);
return ;
}

Luogu3195 [HNOI2008]玩具装箱TOY (方程变形 + 斜率优化 )的更多相关文章

  1. bzoj1010: [HNOI2008]玩具装箱toy(DP+斜率优化)

    1010: [HNOI2008]玩具装箱toy 题目:传送门 题解: 很明显的一题动态规划... f[i]表示1~i的最小花费 那么方程也是显而易见的:f[i]=min(f[j]+(sum[i]-su ...

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

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

  3. [HNOI2008]玩具装箱toy(dp+斜率优化)

    斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i  ,  f[i]=sum[i]+i ,  c=L+1; 首先我们能 ...

  4. 【BZOJ】1010: [HNOI2008]玩具装箱toy(dp+斜率优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1010 蛋疼用latex写了份题解.. 2015.03.07 upd:很多东西可能有问题,最好看下边提 ...

  5. [luogu3195 HNOI2008] 玩具装箱TOY (斜率优化dp)

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

  6. luogu3195 [HNOI2008]玩具装箱TOY

    懒得写 #include <iostream> #include <cstdio> using namespace std; typedef long long longliv ...

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

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

  8. 斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy

    本文为原创??? 作者写这篇文章的时候刚刚初一毕业…… 如有错误请各位大佬指正 从例题入手 洛谷P3915[HNOI2008]玩具装箱toy Step0:读题 Q:暴力? 如果您学习过dp 不难推出d ...

  9. Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)

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

随机推荐

  1. go time笔记

    package main import ( "time" "fmt" ) func main() { t := time.Now().UnixNano() fm ...

  2. Github开源项目单

    以下涉及到的数据统计与 2019 年 5 月 1 日 12 点,数据来源:https://github.com/trending/java?since=monthly . 下面的内容从 Java 学习 ...

  3. Bluefish

    Bluefish标榜其自身是“一款为熟练的Web设计员和程序员而设的编辑器,但它的UI却很直观,任何初学者都能够很快上手,并在不断地积累中发现和掌握它的其它功能.   Bluefish标榜其自身是“一 ...

  4. How To Install and Secure phpMyAdmin on Ubuntu 12.04(MySQL图形管理)

    原文参考链接:https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-phpmyadmin-on-ubun ...

  5. arcgis jsapi接口入门系列(10):图形高亮

    jsapi也有提供高亮的实现接口,但这里没用,而用的是一种改变图形(graphic)样式的思路 本文实现效果是:地图有多个面图形,当鼠标移动到面的上方,面高亮显示,鼠标移出后高亮解除 初始化 //高亮 ...

  6. Java MVC 分页实例

    共4个文件 requestLogList.jsp RequestInfoController.java RequestInfoBean.java RequestInfoService.java 1.r ...

  7. java实现打开Windows控制台窗口

    在写Python程序的时候突发奇想了一下,能不能用java代码实现打开控制台窗口呢? 经过查询网络资料和java API文档,终于实现了: package com.primeton.cmd; impo ...

  8. python super详解

    一.super() 的入门使用 - 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能, 这时,我们就需要调用父类的方法了,可通过使用 super 来实 ...

  9. 项目经验——jboss 配置数据库连接池

    数据库的连接和关闭是非常消耗系统资源的,在多层结构的应用环境中,这种资源消耗又直接的反映到系统性能上来.在项目实际应用中,最常用的解决方案便是建立数据库连接池. 一.数据库连接池基本原理 当程序启动时 ...

  10. vba 两个表 信息合体一个表格

    1 把Excel某一区域的内容读入到数组中: Dim strArray() As Variant Dim wk_data As Variant Set wk_data = Sheets("S ...