CDOJ 879 摩天轮 dp+斜率优化

原题链接: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][2];

double Y(int t,int j){
    return dp[t][j]+w[t+1]*w[t+1];
}

double X(int t){
    return w[t+1];
}

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 = 1; i <= n; i++)scanf("%d", &w[i]);
    sort(w + 1, w + 1 + n);
    for (int i = 1; i <= n; i++)dp[i][1] = (w[i] - w[1]) * (w[i] - w[1]);
    for (int j = 2; j <= m; j++) {
        int cur = j & 1;
        int front = 0, rear = 0;
        que[rear++] = 1;
        for (int i = 2; i <= n; i++) {
            while (rear - front > 1 && Slope(que[front], que[front + 1], cur ^ 1) <= 2 * w[i])
                front++;
            dp[i][cur] = dp[que[front]][cur ^ 1] + (w[i] - w[que[front] + 1]) * (w[i] - w[que[front] + 1]);
            while (rear - front > 1 && Slope(que[rear - 1], que[rear - 2], cur ^ 1) >= Slope(i, que[rear - 1], cur ^ 1))
                rear--;
            que[rear++] = i;
        }
    }
    printf("%d\n", dp[n][m & 1]);
    return 0;
}
时间: 2024-10-13 09:46:09

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

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

学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很大部分参考了大神Accept的文章,不过此神貌似早已绝迹江湖,这篇文章写得好,也写得很差,前半部分叙述得很好,可是关键,关键部分说得很乱,有些许错误,很多大神都进行了评论指出,但是大神Accept貌似没有修改的意思,故重新总结下,以便自己以后查阅和复习啊. 下面看一个例题Print Article.

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

[ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏.由于地形的不同,在不同工厂建立仓库的费用可能是不同的.第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库的费用是Ci.对于没有建立仓库的工厂,其

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

4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 230  Solved: 156[Submit][Status][Discuss] Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路必须在同一天中走完. Pine希望每一天走的路长度尽可能相近,所以他

Covered Walkway(HDU4258,dp斜率优化)

Covered Walkway Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description Your university wants to build a new walkway, and they want at least part of it to be covered. There are certain points which

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

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P

DP 斜率优化题目/决策单调性题目

斜率优化 冬令营讲到了dp斜率优化后瞎写了一些斜率优化,因为毕竟上次写是老早以前了,当时对这个并不是很理解,现在有一点数学基础,稍微好一点了. 瞎找的斜率优化题,可能有点太水了,我这种这么菜的人竟然都切得那么快.可能难度不够,因为有个y坐标不单调要套个平衡树的我是真不会,这个嘛以后再说了. 1.hdu3507 Print Article 给定非负数列,划成若干块,每块价值是左边那玩意儿.求总权值min. 这个自己写写就可以搞出来了吧,现在看真心不难,除非数值有负的..那个要平衡树,现在写不动.

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

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P

hdu 3507(DP+斜率优化)

Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 6653    Accepted Submission(s): 2054 Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique

BZOJ3437:小P的牧场(DP+斜率优化)

小P的牧场[题目描述]背景:小P 是个特么喜欢玩MC 的孩纸...小P 在MC 里有n 个牧场,自西向东呈一字形排列(自西向东用1…n 编号),于是他就烦恼了:为了控制这n 个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制站控制的牧场是它所在的牧场一直到它西边第一个控制站的所有牧场(它西边第一个控制站所在的牧场不被控制)(如果它西边不存在控制站,那么它控制西边所有的牧场),每个牧场被控制都需要一定的花费(毕竟在控制站到牧场间修建道路是需要资源的嘛~),而且该花费等于