题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1597

题意:

  有n块矩形土地,长为a[i],宽为b[i]。

  FJ想要将这n块土地全部买下来。

  土地可以分组购买。

  若有某一些土地被分到了一组,则将这一组土地全部买下的花费为他们的max(a[i])*max(b[i])。

  问你最小总花费是多少。

题解:

  首先,如果一块土地能够被另一块土地完全包含(即长宽都比另一个小),那么被包含的那块土地可以忽略不计。

  然后贪心地考虑如何使花费最小:

    如果要使花费尽可能小,则分在同一组中矩形的长宽差距应尽可能地小。

  所以将长a[i]作为第一关键字,将宽b[i]作为第二关键字排序。

  此时矩形的长a[i]一定是非降的,那么对于两个矩形i和j(i<j),如果有b[i]<=b[j],则j一定能完全包含i。

  利用这一特性将所有能被包含的矩形去掉。

  此时矩形的宽b[i]就变成了严格递减的了。

  显然,此时分到一组中的矩形必须是连续的一段区间,才有可能最优。

  然后就可以dp了。

  表示状态:

    dp[i]表示已经购买了前i块土地的最小花费。

  找出答案:

    假设去掉能被包含的矩形之后,矩形总数为tot。

    ans = dp[tot]

  如何转移:

    dp[i] = min dp[j] + a[i]*b[j+1]

  边界条件:

    dp[0] = 0

  斜率优化:

    设j < k,且k的决策更优。

    则:dp[j] + a[i]*b[j+1] > dp[k] + a[i]*b[k+1]

    整理得:(dp[k]-dp[j])/(b[j+1]-b[k+1]) < a[i]

    所以slope(i,j) = (dp[i]-dp[j])/(b[j+1]-b[i+1])

    由于a[i]非降,所以用单调队列维护下凸壳即可。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 50005 using namespace std; struct Rect
{
long long a,b;
Rect(long long _a,long long _b)
{
a=_a; b=_b;
}
Rect(){}
friend bool operator < (const Rect &x,const Rect &y)
{
return x.a!=y.a ? x.a<y.a : x.b<y.b;
}
}; int n;
int q[MAX_N];
long long dp[MAX_N];
Rect x[MAX_N]; void read()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>x[i].a>>x[i].b;
}
} inline double slope(int i,int j)
{
return (double)(dp[i]-dp[j])/(x[j+].b-x[i+].b);
} void work()
{
sort(x+,x++n);
int tot=;
for(int i=;i<=n;i++)
{
while(tot && x[i].b>=x[tot].b) tot--;
x[++tot]=x[i];
}
x[tot+]=Rect(,);
int l=,r=;
q[]=,dp[]=;
for(int i=;i<=tot;i++)
{
while(l<r && slope(q[l],q[l+])<=x[i].a) l++;
dp[i]=dp[q[l]]+x[i].a*x[q[l]+].b;
while(l<r && slope(q[r],i)<slope(q[r-],q[r])) r--;
q[++r]=i;
}
cout<<dp[tot]<<endl;
} int main()
{
read();
work();
}

BZOJ 1597 [Usaco2008 Mar]土地购买:斜率优化dp的更多相关文章

  1. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

  2. bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...

  3. BZOJ 1597: [Usaco2008 Mar]土地购买 斜率优化

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MB Description 农夫John准备扩大他的农场,他正在考虑N ...

  4. bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5524  Solved: 2074[Submit] ...

  5. bzoj1597 [Usaco2008 Mar]土地购买——斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 就是斜率优化水题... 然而WA了十几遍,正负号处理真让人心累... 还是该负就负,别 ...

  6. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  7. BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4989  Solved: 1847[Submit] ...

  8. 斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24387147 [原题] 1597: [Usaco2008 Mar]土地购买 Time ...

  9. bzoj 1597: [Usaco2008 Mar]土地购买【斜率优化】

    按xy降序排序,把能被完全包含的去掉 然后就得到了x升序y降序的一个数组 然后方程就显然了:f[i]=min(f[j]+y[j+1]x[i]) 斜率优化转移 说起来我还不会斜率优化呢是不是该学一下了 ...

随机推荐

  1. 我的_vimrc文件

    """"""""""""""""&quo ...

  2. Ext如何Gird中如何显示时间类型的列?

         rt,后台bean中的字段属性是Date类型,前台的model中的字段属性也设置为date类型,但是还是显示不出来,如何解决呢? 直接代码: grid中的COLUMN: Model中的定义:

  3. Redis源码阅读-Adlist双向链表

    Redis源码阅读-链表部分- 链表数据结构在Adlist.h   Adlist.c Redis的链表是双向链表,内部定义了一个迭代器. 双向链表的函数主要是链表创建.删除.节点插入.头插入.尾插入. ...

  4. android 小游戏之数字猜猜

    http://www.cnblogs.com/whatbeg/p/4152333.html

  5. python函数-------python2.7教程学习【廖雪峰版】(三)

    任务: 看完函数这一章    已完成 2017年6月8日16:23:491.函数的作用:写较少的代码实现较多的功能,可以多次被调用.2.可见,借助抽象,我们才能不关心底层的具体计算过程,而直接在更高的 ...

  6. Unity3d 摇杆奖励

    单个单元: publicclass RockerSingle : MonoBehaviour { // 枚举.类别 RockerType  rockerType; //是否有效,最上面的为无效,即为f ...

  7. centos7.0 安转apache2.4

    安装apache2.4的需要安转apr和apr-util 包 APR和APR-util的下载地址 http://apache.fayea.com//apr/apr-1.6.2.tar.gzhttp:/ ...

  8. [转]jquery中innerWidth(),outerWidth(),outerWidth(true)和width()的区别

    转自:http://www.cnblogs.com/keyi/p/5933981.html   jquery中innerWidth(),outerWidth(),outerWidth(true)和wi ...

  9. http => https 升级

    准备证书 阿里云安全(云盾)-> CA证书服务,购买证书,个人测试的话可以使用免费的,期限1年. 购买证书后,把域名与证书进行绑定,提交审核,大概10分钟左右,正常情况下审核就可以通过.证书准备 ...

  10. EF之POCO应用系列2——复杂类型

    在.NET开发中,EF4以前的版本以及LINQ TO SQL都不支持complex数据类型,EF4终于支持complex类型的数据了,这意味着微软的EF框架朝领域驱动方面又迈了一大步. 复杂的数据类型 ...