bzoj 1597 斜率DP
1597: [Usaco2008 Mar]土地购买
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 5115 Solved: 1897
[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
100 1
15 15
20 5
1 100
输入解释:
共有4块土地.
Sample Output
HINT
FJ分3组买这些土地: 第一组:100x1, 第二组1x100, 第三组20x5 和 15x15 plot. 每组的价格分别为100,100,300, 总共500.
首先对决策的有序,对土地按照长 x,宽 y 递增排序。
如果:
第一块土地,和第二块土地,第二块土地长宽都要比第一块大,那么第一块就等于不起作用,那么可以不用考虑第一块土地,
于是删掉所有这种不需要考虑的土地,就成了 x 递增,y 递减排列的土地。
这时候,对于前面 i 块土地来说,会可以分成很多部分,要成本最少的一种划分。于是——DP思路就来了。
f[i] 前 i 块土地的最优值。
那么:

这样O(n^2) 的算法就呼之欲出了,但是,还是会TLE;
怎么办呢?
斜率DP:


对于 i 点,与之相切的点 斜率才最小,保证 < x[i] ,这个点才是划分点。
到这里,分析就已经完成了,只差队列维护决策点。这个凸多边形了。
就是套路了,
- 考虑凸多边相切的变化规律,找到划分点。
- 用划分点计算新的值。
- 新的值更新凸多边形
#include <bits/stdc++.h> using namespace std; typedef long long ll;
const int maxn = ; struct Node
{
ll x,y;
bool operator < (const Node& rhs) const {
if(x==rhs.x) return y < rhs.y;
return x < rhs.x;
}
}p[maxn]; ll n,f[maxn],q[maxn]; double slope(long long a,long long b) {
return (1.0*(f[a]-f[b])/(p[a+].y-p[b+].y));
} int main(int argc, char const *argv[])
{
scanf("%I64d",&n); for(int i = ; i <= n; i++)
scanf("%I64d%I64d",&p[i].x,&p[i].y); sort(p+,p+n+); int cnt = ;
for(int i = ; i <= n; i++) {
if(p[i].y<=p[i+].y) continue;
while(cnt&&p[cnt].y<=p[i].y) --cnt;
p[++cnt] = p[i];
} int h = ,t = ;
q[h] = ; for(int i = ; i <=cnt; i++) {
while(t-h>&&slope(q[h],q[h+])>=-p[i].x) ++h; //删除队首非最优决策点 f[i] = f[q[h]] + p[q[h]+].y * p[i].x; while(t-h>&&slope(q[t-],q[t-])<slope(q[t-],i)) --t;
q[t++] = i; } cout<<f[cnt]<<endl;
return ;
}
参考:http://www.cnblogs.com/akhpl/p/6715148.html
bzoj 1597 斜率DP的更多相关文章
- 【无聊放个模板系列】BZOJ 1597 斜率优化
STL 双向队列DEQUE版本 #include<cstdio> #include<cstdlib> #include<cstring> #include<i ...
- 【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3601 Solved: 1322 Descrip ...
- bzoj 3437 斜率优化DP
写题解之前首先要感谢妹子. 比较容易的斜率DP,设sum[i]=Σb[j],sum_[i]=Σb[j]*j,w[i]为第i个建立,前i个的代价. 那么就可以转移了. /**************** ...
- bzoj 3156 防御准备(斜率DP)
3156: 防御准备 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 837 Solved: 395[Submit][Status][Discuss] ...
- bzoj 1010 斜率优化DP
我的第二道斜率DP. 收获: 1.假设两个位置:p<q<i,然后让某一位置优,看其满足什么性质,所谓斜率优化就是满足: (g[q]-g[p])/(f[q]-f[p]) op h[i] 要 ...
- bzoj4518: [Sdoi2016]征途--斜率DP
题目大意:把一个数列分成m段,计算每段的和sum,求所有的sum的方差,使其最小. 由方差*m可以化简得ans=m*sigma(ki^2)-sum[n]^2 很容易得出f[i][j]=min{f[i- ...
- hdu 3507 斜率dp
不好理解,先多做几个再看 此题是很基础的斜率DP的入门题. 题意很清楚,就是输出序列a[n],每连续输出的费用是连续输出的数字和的平方加上常数M 让我们求这个费用的最小值. 设dp[i]表示输出前i个 ...
- 斜率dp cdq 分治
f[i] = min { f[j] + sqr(a[i] - a[j]) } f[i]= min { -2 * a[i] * a[j] + a[j] * a[j] + f[j] } + a[i] * ...
- HDU 2829 Lawrence (斜率DP)
斜率DP 设dp[i][j]表示前i点,炸掉j条边的最小值.j<i dp[i][j]=min{dp[k][j-1]+cost[k+1][i]} 又由得出cost[1][i]=cost[1][k] ...
随机推荐
- RSA加密、解密、签名、校验签名
先说下RSA概率: 公钥和私钥是通过本地openssl软件生成. 正常: 公钥加密=>私钥解密: 私钥签名=>公钥校验签名 最近做一个项目,对方用java公钥去校验签名,这边java的De ...
- request-statistics.lua
--[[ 实现请求统计,并且将单位时间内异常次数达到阀值的请求加入到黑名单中 --]] --获取共享内存 local limit_req_store = ngx.shared.limit_req_st ...
- 025-quartz之spring部分配置模板
版本一: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://w ...
- 【密码学】RSA算法原理
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密. RSA的算法涉及三个参数,n.e1.e2. 其中,n是两个大质数p.q的积,n的二进制 ...
- 解决引入外部文件(图片、js等)出现 403 net::ERR_ABORTED 的问题
页面中引入外网的链接资源,会产生一个新的http请求.为了安全(URL里可能包含用户信息),浏览器一般都会给这写请求头加上表示来源的referrer 字段. 所以,此时我们需要隐藏外部链接中的refe ...
- 生成正射影像/DSM,等高线提取
工具:ContextCapture,Globe Mapper 方法/步骤: 1.新建项目,导入影像,提交空三运算 在ContextCapture中新建项目,添加相关影像或视频和其他相关资源,资源,提交 ...
- 检测SQL Server表占用空间大小SQL
检测SQL Server表占用空间大小SQL,要先选择需要查询的数据库,然后点击执行下面脚本. ),ROWS ),reserved ) ,Data ) ,index_size ) ,Unused ) ...
- android JNI学习之一
执行System.loadLibrary()函数时,VM会反向调用*.so里的JNI_OnLoad()函数.用途有二:1. VM询问此*.so使用的JNI版本编号.2. VM要求*.so做一些初期设定 ...
- [LeetCode]23. Merge k Sorted Lists合并K个排序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- GUI应用程序架构的十年变迁:MVC,MVP,MVVM,Unidirectional,Clean
十年前,Martin Fowler撰写了 GUI Architectures 一文,至今被奉为经典.本文所谈的所谓架构二字,核心即是对于对于富客户端的 代码组织/职责划分 .纵览这十年内的架构模式变迁 ...