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; }
转载于:https://www.cnblogs.com/HarryGuo2012/p/4841215.html
CDOJ 879 摩天轮 dp+斜率优化相关推荐
- BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...
- BZOJ 3156: 防御准备( dp + 斜率优化 )
dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...
- 【BZOJ-3156】防御准备 DP + 斜率优化
3156: 防御准备 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 951 Solved: 446 [Submit][Status][Discus ...
- [HNOI2008]玩具装箱toy(dp+斜率优化)
斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i , f[i]=sum[i]+i , c=L+1; 首先我们能 ...
- UVAlive 6131 dp+斜率优化
这道题和06年论文<从一类单调性问题看算法的优化>第一道例题很相似. 题意:给出n个矿的重量和位置,这些矿石只能从上往下运送,现在要在这些地方建造m个heap,要使得,sigma距离*重量 ...
- hdu 3507 Print Article(dp+斜率优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题解:显然这题的递推很容易得到 dp[i]=dp[j]+(sum[i]-sum[j])^2+m ...
- C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )
链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...
- P3994 高速公路 树形DP+斜率优化+二分
$ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...
- FZU - 2302 Necklace (dp+斜率优化)
I - Necklace FZU - 2302 题目大意:给出一个环每一段的价值为区间和的平方,求将环断成k断的最小价值之和. 解题思路:容易想到n^4的dp 首先断环成链,将数组复制一遍. 用dp[ ...
最新文章
- 如何安装和配置 Rex-Ray?- 每天5分钟玩转 Docker 容器技术(74)
- WijmoJS 使用Web Workers技术,让前端 PDF 导出效率更高效
- python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解
- 6个步骤卸载wine
- Anti-Aliasing SSAA MSAA MLAA SRAA 简介
- xml解析-jaxp添加结点
- 本地网页服务器 跨域,nodejs搭建本地服务器轻松解决跨域问题
- react配合python_部署React前端和Django后端的3种方法
- 傅立叶变换,时域,频域二
- 对于 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针 的简单理解
- IPMI IPMB协议
- Mybatis3.5.4官网下载
- 一文彻底搞懂方差、协方差、协方差矩阵
- Linux 根分区扩容
- 计算机无法安装MUMU模拟器,电脑手机模拟器,详细教您电脑手机模拟器MuMu模拟器怎么使用...
- Ubuntu修改DNS
- STM32MP157移植Qt5.12.10
- window系统 实现FFmpeg 录制音视频
- cs231n-2022-assignment1#Q1:kNN图像分类器实验
- QGraphicsItem图元旋转缩放和自定义图元(三)