决策单调性Ⅱ:斜率优化(1597: [Usaco2008 Mar]土地购买)
决策单调性Ⅰ:四边形不等式:
http://blog.csdn.net/jaihk662/article/details/78174717
决策单调性:
- 对于dp[i] = min(dp[i], dp[j]+w[j, i])中所有的x>y,一定满足k[x]>=k[y],其中k[x]表示x点的最优决策点
也就是说每个决策点能决策的区间一定是连续的一段,并且随着决策点的右移,这个区间也在不断右移,这样就可以用栈或者二分来O(nlogn)解决原本O(n²)的DP,而斜率优化可以处理一些特殊的单调性DP,并且能做到O(n)的复杂度
还是这个例子:1010: [HNOI2008]玩具装箱toy
这题的dp方程为:dp[i] = min(dp[j]+(sum[i]-sum[k]+i-j-1-L)²)(其中sum[]是前缀和,单调递增)
设A[i] = sum[i]+i-1-L;B[i] = sum[i]+i
有dp[i] = min(dp[j]+(A[i]-B[j])²) = A[i]²+min(-2A[i]B[j]+B[j]²+dp[j])
再设a[i] = -2A[i],x(j) = B[j],y(j) = B[j]²+dp[j]
那么方程就变成了经典形式:f(i) = min(a[i]*x(j)+y(j)),也就是G = ax+y(y = -ax+G)
而我们的目的就是找到一组(x, y)使得G最小
这就相当于空间中有若干个点(x', y'),并且有一条斜率已经确定的直线,让这条直接经过某个点,使得直线与y轴的截距最小,又因为A[i]单调递增的缘故,a = -2A[i],斜率2A[i]一定是单调递增的,同理x和y也单调递增
假设n=6,建模如下图:
将图中的点从左到右依次编号1,2,3,4,5,6,对应着6个决策点(别忘了还有0号点就是坐标原点)
而图中的两条绿线分别是斜率为2a[1]和2a[3]的第1,3条直线,其它直线省略未画出
DP过程如下:
- 0号点入队
- 当遍历第一个决策点时,队列只有1个元素,直接进队
- 当遍历第二个决策点时,队列有2个元素(0和1),判断经过0号点和1号点的直线斜率(为了以后方便,经过x号点和y号点的直线就省略为直线xy)是否大于当前斜率2a[2],如果小于,说明0号点被1号点完爆,从次往后直线经过1号点绝对会比经过0号点更优,所以弹出0号点
先假设大于,也就是当前还是0号点还是最优决策,情况如下(下图就是大于的情况)
- 其中粉线代表直线01,绿线代表斜率2a[2]的直线,我们不妨将绿线向下平移,直到绿线覆盖1号决策点,那么就可以发现明显还是粉线的截距更小,这就意味着粉线的G更小,还是0号点更优,所以不弹出队列
- 然后再比较直线01的斜率和直线12的斜率,看是否满足前者小于后者,如果不满足,说明1号点要被弹出,因为后面点要不选0号点,要不就选2号点,绝对不选1号点(维护下凸包),而上图中1号点显然不用被弹出,所以遍历完第二个点后没有任何点被弹出,并当前最优决策点还是0号点
- 2号点进队,此时从队尾到队首元素分别为0,1,2
- 遍历第三个点后,0号点被弹出(直线01斜率小于2a[3]了),1号点仍然不会被弹出,队尾搞定了,再看队首,一样维护下凸包,2号点被弹出
- 3号点进队,此时从队尾到队首元素分别为1,3
- ……
这样搞一趟下来,由于每个点只会进栈出栈1次,所以成功在O(n)时间内求出了所有的最优决策!
下面就是道模板题
1597: [Usaco2008 Mar]土地购买
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 5286 Solved: 1961
[Submit][Status][Discuss]
Description
农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25. FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费. 他需要你帮助他找到最小的经费.
Input
* 第1行: 一个数: N
* 第2..N+1行: 第i+1行包含两个数,分别为第i块土地的长和宽
Output
* 第一行: 最小的可行费用.
Sample Input
4
100 1
15 15
20 5
1 100
Sample Output
500
首先一个显而易见的贪心,所有的土地按x[]从小到大排序,x[]相同就按y[]从小到大排序
这样下来每一组的所有土地一定是连续的
有dp方程:dp[now] = min(dp[now], dp[j]+x[now]*max(y[i], i∈(j+1, now)) )
理论上可以斜率优化时线段树维护最大值,但这样挺麻烦的
考虑再贪心:如果排序后某一块土地的x[]值小于它后面一块(其实这个是肯定的都排了序)并且y[]值也小于它后面一块,那么这一块就可以无视,因为这样的话你只用多选它后面那一块其实就ok了,这块就一定没有贡献,有贡献就一定不是最优解
这样处理完毕之后整个序列就一定满足x递增的同时y递减,dp方程变为
dp[now] = min(dp[now], dp[j]+x[now]*y[j+1])
将其转化成标准形式:y = -ax+G有a = x[now];x = y[j+1];y = dp[j]
因为斜率k和x单调递减,y单调递增,所以要维护上凸包,有方程
-x[now]<(dp[j]-dp[k])/(y[j+1]-y[k+1]),就说明k点比j点更优
#include<stdio.h>
#include<algorithm>
using namespace std;
#define LL long long
typedef struct Res
{LL x, y;bool operator < (const Res &b) const{if(x<b.x || x==b.x && y<b.y)return 1;return 0;}
}Res;
Res s[50005];
LL st[50005], dp[50005];
double Calc(LL j, LL k)
{return 1.0*(dp[j]-dp[k])/(s[j+1].y-s[k+1].y);
}
int main(void)
{LL n, i, cnt, L, R;scanf("%lld", &n);for(i=1;i<=n;i++)scanf("%lld%lld", &s[i].x, &s[i].y);sort(s+1, s+n+1);cnt = 0;for(i=1;i<=n;i++){while(cnt>=1 && s[i].y>=s[cnt].y)cnt--;s[++cnt] = s[i];}n = cnt;L = R = 1;for(i=1;i<=n;i++){while(R>L && Calc(st[L], st[L+1])>-s[i].x)L++;dp[i] = dp[st[L]]+s[i].x*s[st[L]+1].y;while(R>L && Calc(st[R], i)>Calc(st[R-1], st[R]))R--;st[++R] = i;}printf("%lld\n", dp[n]);return 0;
}
决策单调性Ⅱ:斜率优化(1597: [Usaco2008 Mar]土地购买)相关推荐
- BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...
- bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...
- bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...
- bzoj 1597: [Usaco2008 Mar]土地购买【斜率优化】
按xy降序排序,把能被完全包含的去掉 然后就得到了x升序y降序的一个数组 然后方程就显然了:f[i]=min(f[j]+y[j+1]x[i]) 斜率优化转移 说起来我还不会斜率优化呢是不是该学一下了 ...
- BZOJ 1597 [Usaco2008 Mar] 土地购买
题意:中文题意,自行理解: 思路:这个题和hdu 1300 的题很像,算是一种类似于二维的扩展,题目不是很难,但窝发现网上的一些题解有些地方说的不是很清楚,在计算斜率优化式的时候,tzw大牛的博客里适 ...
- 【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3601 Solved: 1322 Descri ...
- bzoj1597[Usaco2008 Mar]土地购买
bzoj1597[Usaco2008 Mar]土地购买 题意: n块土地,现在要求把土地分成几份,每份费用为该份中土地长最大值和宽最大值成绩,要求最小费用.n≤5000 题解: 当一块土地长宽都比另一 ...
- BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)
题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...
- bzoj1597 [Usaco2008 Mar]土地购买
题目描述 题解: 我们可以考虑这样一种情况,有一块$10*10$的土地,还有一块$1*1$的土地. 当然将$1*1$的土地合到$10*10$的土地中了. 所以我们可以先按土地$x$值从大到小排序,然后 ...
最新文章
- Python学习笔记《Python核心编程》第4章Python对象
- Android—Gson原理解析
- Yii权限管理工具Srbac使用小结
- Python获取两个列表list的不同之处
- C/C++库函数math用法案例篇二
- 人工智能数学基础之概率论
- C++ cmake 命令用法
- sphinx服务器安装及配置详解
- 南宁研祥智谷远程预付费电能管理系统的应用
- yml格式写法中容易遇到的坑
- 风物长宜放眼量,人间正道是沧桑 - 一位北美 IT 技术人破局
- html提示框延时消失,javascript实现延时显示提示框特效代码
- 天上的街市Unity游戏场景制作案例(一)
- Gossip算法详解
- LIGO引力波探测原理
- ant design vue时间范围(range-picker)自定义时间段范围
- 阅读Logback文档笔记--Logback的Appender配置
- 单精度(float) 双精度 (double) 区别
- QT Quick项目简介
- flashlight--spotlight的好帮手
热门文章
- python免费全套教程-python入门免费教程看这些就够了
- python兼职程序员工资-没想到,学会Python即使不做程序员都能月入过万!
- 【重磅】亚马逊向第三方开放Echo音箱语音识别技术(附AmazonEcho Dot拆解)
- 离线语音识别_离线语音识别库_离线语音识别sdk - 云+社区 - 腾讯云
- HTML5网页语音识别功能演示
- 语音识别技术原理是什么 讯飞语音识别技术特点介绍【详解】
- 四叶草启动linux黑屏,四叶草剧场黑屏进不去解决方法一览
- php使用jasperreport,用PHP访问JasperReport | 学步园
- HTTP和HTTPS的理解
- 从硬件竞争到软实力PK——电视媒体竞争观察