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][];
- 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+斜率优化的更多相关文章
- 【BZOJ-4518】征途 DP + 斜率优化
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 230 Solved: 156[Submit][Status][ ...
- 【BZOJ-3437】小P的牧场 DP + 斜率优化
3437: 小P的牧场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 705 Solved: 404[Submit][Status][Discuss ...
- 【BZOJ-1010】玩具装箱toy DP + 斜率优化
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8432 Solved: 3338[Submit][St ...
- 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)
http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...
- BZOJ 1096: [ZJOI2007]仓库建设(DP+斜率优化)
[ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在 ...
- 学渣乱搞系列之dp斜率优化
学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很 ...
- DP斜率优化总结
目录 DP斜率优化总结 任务安排1 任务计划2 任务安排3 百日旅行 DP斜率优化总结 任务安排1 首先引入一道题,先\(O(N^2)\)做法:分别预处理出\(T_i,C_i\)前缀和\(t[i],c ...
- HDU 3507 [Print Article]DP斜率优化
题目大意 给定一个长度为\(n(n \leqslant 500000)\)的数列,将其分割为连续的若干份,使得 $ \sum ((\sum_{i=j}^kC_i) +M) $ 最小.其中\(C_i\) ...
- dp斜率优化
算法-dp斜率优化 前置知识: 凸包 斜率优化很玄学,凭空讲怎么也讲不好,所以放例题. [APIO2014]序列分割 [APIO2014]序列分割 给你一个长度为 \(n\) 的序列 \(a_1,a_ ...
随机推荐
- python numpy模块
目录 numpy模块 一维数组 二维数组(用的最多的) 获取多维数组的行和列 多维数组的索引 高级功能 多维数组的元素的替换 通过函数方法创建多维数组 矩阵的运算 点乘和转置(了解) 点乘必须 m*n ...
- day24 02 单继承(派生)
day24 02 单继承(派生) 1.首先来看一个简单的例子 比如: 狗类的属性有:吃,喝,看门 鸟类的属性有:吃,喝,下蛋 看门和下蛋就是这两种动物不同的属性,而吃喝是两个共同的属性 以下代码实现了 ...
- redis的字符串操作以及在django中的使用
redis ----redis.MongoDB : 非关系型数据库 redis 存储在内存中 MongoDB 存储在硬盘中 l 简介 redis是一个key-value存储系统 , 支持持久化 ...
- spring事务(Transaction )报 marked as rollback-only异常的原因及解决方法
很多朋友在使用spring+hibernate或mybatis等框架时经常遇到报Transaction rolled back because it has been marked as rollba ...
- unix cc编译过程
1.编译并链接一个完全包含与一个源文件的C程序: cc program.c 这条命令产生一个称为a.out的可执行程序.中间会产生一个名为program.o的目标 ...
- html5/css3常考面试题
一.HTML5 CSS3 CSS3有哪些新特性? 1. CSS3实现圆角(border-radius),阴影(box-shadow), 2. 对文字加特效(text-shadow.),线性渐变(gra ...
- wordpress 获取站点的所有链接
<?php include "wp-load.php"; $posts = new WP_Query('post_type=any&posts_per_page=-1 ...
- 使用 Rails Webpacker 安裝 Foundation 6
動機 由於 foundation-rails 6.4.1 版本有個 Issue 目前還沒合併.加上 Rails 已經支援了 webpack 2.x.這篇文章純粹紀錄另外一種做法. 準備 開始使用之前需 ...
- 解压文件夹python
# _*_ coding: utf-8 _*_ import zipfile import shutil import os print os.getcwd() basedir = os.path.d ...
- PHP_命名空间
namespace NS; define(__NAMESPACE__ .'\foo','111'); define('foo','222'); echo foo; // 111. echo \foo; ...