原题链接:http://www.acm.uestc.edu.cn/#/problem/show/879

题意:

中文题

题解:

这是一道斜率dp的题。

先把$a$数组排个序。

令$dp[i][j]$表示第$i$个人坐在第$j$个箱子里面的最优解。

容易得到以下转移方程:

$$dp[i][j]=min \left \{ dp[k][j-1]+(a[i]-a[k+1])^2 \right \}$$

观察这个式子,发现好像可以斜率优化:

若$u>v$且$u$要比$v$优,即:

$$dp[u][j-1]+(a[i]-a[u+1])^2<dp[v][j-1]+(a[i]-a[v+1])^2$$

整理后可得到下式:

$$\frac {dp[u][j-1]+a[u+1]^2-(dp[v][j-1]+a[v+1]^2)} {a[u+1]-a[v+1]} < 2*a[i]$$

$$Y(t)=dp[t][j-1]+a[t+1]^2$$

$$X(t)=a[t+1]$$

那么原式就是:

$$\frac {Y(u)-Y(v)} {X(u)-X(v)} <2*a[i]$$

这是一个描述斜率的东西,它表明,如果$u,v$的斜率小于$2*a[i]$,那么$u$一定比$v$更优,否则$v$不比$u$差。

令$S(u,v)=\frac {Y(u)-Y(v)} {X(u)-X(v)}$,那么如果$S(u,v)<S(v,w)$,那么$b$一定是没用的状态,这是因为假如$S(u,v)<2*a[i]$,那么$u$比$v$更优,如果$S(u,v) \geq 2*a[i]$,那么$S(v,w) \geq 2*a[i]$,那么$w$不比$v$差。所以$v$就是没用的节点。

综上,我们可以通过一个双端队列来维护一个下凸包,向队尾插入值,维护队尾的单调性。从队首寻找答案。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define MAX_N 100005
using namespace std; int n,m;
int w[MAX_N]; int dp[MAX_N][]; double Y(int t,int j){
return dp[t][j]+w[t+]*w[t+];
} double X(int t){
return w[t+];
} double Slope(int u,int v,int j) {
if (X(u) == X(v))return 1e233;
return (Y(u, j) - Y(v, j)) / (X(u) - X(v));
} int que[MAX_N]; int main() {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)scanf("%d", &w[i]);
sort(w + , w + + n);
for (int i = ; i <= n; i++)dp[i][] = (w[i] - w[]) * (w[i] - w[]);
for (int j = ; j <= m; j++) {
int cur = j & ;
int front = , rear = ;
que[rear++] = ;
for (int i = ; i <= n; i++) {
while (rear - front > && Slope(que[front], que[front + ], cur ^ ) <= * w[i])
front++;
dp[i][cur] = dp[que[front]][cur ^ ] + (w[i] - w[que[front] + ]) * (w[i] - w[que[front] + ]);
while (rear - front > && Slope(que[rear - ], que[rear - ], cur ^ ) >= Slope(i, que[rear - ], cur ^ ))
rear--;
que[rear++] = i;
}
}
printf("%d\n", dp[n][m & ]);
return ;
}

CDOJ 879 摩天轮 dp+斜率优化的更多相关文章

  1. 【BZOJ-4518】征途 DP + 斜率优化

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 230  Solved: 156[Submit][Status][ ...

  2. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  3. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  4. 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...

  5. BZOJ 1096: [ZJOI2007]仓库建设(DP+斜率优化)

    [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在 ...

  6. 学渣乱搞系列之dp斜率优化

    学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很 ...

  7. DP斜率优化总结

    目录 DP斜率优化总结 任务安排1 任务计划2 任务安排3 百日旅行 DP斜率优化总结 任务安排1 首先引入一道题,先\(O(N^2)\)做法:分别预处理出\(T_i,C_i\)前缀和\(t[i],c ...

  8. HDU 3507 [Print Article]DP斜率优化

    题目大意 给定一个长度为\(n(n \leqslant 500000)\)的数列,将其分割为连续的若干份,使得 $ \sum ((\sum_{i=j}^kC_i) +M) $ 最小.其中\(C_i\) ...

  9. dp斜率优化

    算法-dp斜率优化 前置知识: 凸包 斜率优化很玄学,凭空讲怎么也讲不好,所以放例题. [APIO2014]序列分割 [APIO2014]序列分割 给你一个长度为 \(n\) 的序列 \(a_1,a_ ...

随机推荐

  1. 7.Yii2.0框架自定义全局工具函数

    功能: 新建共用方法的打印方法,可以很方便的格式化打印 一.新建helper/function.php <?php /** * Created by Haima. * Author:Haima ...

  2. Python基础——字典(dict)

    由键-值对构建的集合. 创建 dic1={} type(dic1) dic2=dict() type(dic2) 初始化 dic2={'hello':123,'world':456,'python': ...

  3. static关键字所导致的内存泄漏问题

    大家都知道内存泄漏和内存溢出是不一样的,内存泄漏所导致的越来越多的内存得不到回收的失手,最终就有可能导致内存溢出,下面说一下使用staitc属性所导致的内存泄漏的问题. 在dalvik虚拟机中,sta ...

  4. 这一千个Python库,总有你想要的!

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  5. JAVA基础篇—HashMap

    /class Depositor package 银行储户; public class Depositor { private String id; private String name; priv ...

  6. spring+struts2+mybatis框架依赖pom.xml

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  7. Angular Vue React 框架中的 CSS

    框架中的 CSS Angular Vue React 三大框架 Angular Vue 内置样式集成 React 一些业界实践 Angular Angular . js (1.x):没有样式集成能力 ...

  8. Oracle 了解 DDL 操作与 REDO 的关系

    目录 了解 DDL 操作与 REDO 的关系 DDL是否会产生REDO 通过 10046 trace 来分析create 和drop 如果drop失败,redo的变化 了解 DDL 操作与 REDO ...

  9. day05_04 数据类型-数值、布尔值、字符串简介

    数据运算 数据类型初识 数字 整数 int(integer) 整型 长整型 在python3里面已经不区分整型和长整型了,统一都叫整型 在32位机器上,整数的位数为32位,取值范围为-2**31-2* ...

  10. Leetcode 481.神奇字符串

    神奇字符串 神奇的字符串 S 只包含 '1' 和 '2',并遵守以下规则: 字符串 S 是神奇的,因为串联字符 '1' 和 '2' 的连续出现次数会生成字符串 S 本身. 字符串 S 的前几个元素如下 ...