题目描述

  平面上有\(n\)个点,你要用一些矩形覆盖这些点,要求:

  • 每个矩形的下边界为\(y=0\)
  • 每个矩形的大小不大于\(s\)

  问你最少要用几个矩形。

  \(n\leq 100,1\leq y\leq s\)

题解

  先把坐标离散化。

  猜(zheng)一个结论:最优解中任意两个矩形的横坐标只可能是相离或包含,不可能是相交。证明略。

  考虑区间DP。

  设\(f_{l,r,h}\)为覆盖横坐标\(l\sim r\),纵坐标\(>h\)的所有矩形需要的最少次数。

  枚举\(l,r,h\),有两种转移:

  • 找到一个横坐标\(i\),使得没有任意一个矩形穿过\(i\)。枚举\(i\)分治即可。
  • 放一个横坐标为\(l\sim r\)的矩形,把高度设为上限。

  对于每一个\(h\),这一层的转移是\(O(n^3)\)的,到下一层的转移是\(O(n^2\log n)\)的,所以总时间复杂度就是\(O(n^4)\)。

  用记忆化搜索可以跑得飞快。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<utility>
using namespace std;
typedef pair<int,int> pii;
int n,s;
pii a[110];
int f[110][110][110];
int xx[110];
int yy[110];
int m1,m2;
int d[110];
int gao(int x)
{
return x?s/x:0x3fffffff;
}
int gao(int l,int r,int h)
{
int &s=f[h][l][r];
if(~s)
return s;
while(l<=r&&d[l]<=h)
l++;
while(l<=r&&d[r]<=h)
r--;
if(l>r)
return s=0;
int i;
s=0x7fffffff;
for(i=l;i<r;i++)
s=min(s,gao(l,i,h)+gao(i+1,r,h));
int hh=gao(xx[r]-xx[l]);
if(hh<=yy[h])
return s;
int v=upper_bound(yy+1,yy+m2+1,hh)-yy-1;
s=min(s,gao(l,r,v)+1);
return s;
}
void solve()
{
scanf("%d%d",&n,&s);
int i;
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i].first,&a[i].second);
xx[i]=a[i].first;
yy[i]=a[i].second;
}
sort(xx+1,xx+n+1);
sort(yy+1,yy+n+1);
m1=unique(xx+1,xx+n+1)-xx-1;
m2=unique(yy+1,yy+n+1)-yy-1;
memset(f,-1,sizeof f);
for(i=1;i<=m1;i++)
d[i]=0;
for(i=1;i<=n;i++)
{
a[i].first=lower_bound(xx+1,xx+m1+1,a[i].first)-xx;
a[i].second=lower_bound(yy+1,yy+m2+1,a[i].second)-yy;
d[a[i].first]=max(d[a[i].first],a[i].second);
}
int ans=gao(1,m1,0);
printf("%d\n",ans);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
int t;
scanf("%d",&t);
while(t--)
solve();
return 0;
}

【XSY2693】景中人 区间DP的更多相关文章

  1. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  2. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  3. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  4. BZOJ1055: [HAOI2008]玩具取名[区间DP]

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1588  Solved: 925[Submit][Statu ...

  5. poj2955 Brackets (区间dp)

    题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...

  6. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  7. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

  8. 区间dp总结篇

    前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...

  9. Uva 10891 经典博弈区间DP

    经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...

随机推荐

  1. 线程GIL锁 线程队列 回调函数

    ----------------------------------无法改变风向,可以调整风帆;无法左右天气,可以调整心情.如果事情无法改变,那就去改变观念. # # ---------------- ...

  2. elasticsearch简单操作(一)

    1.增加记录 例如1:向指定的 /Index/Type 发送 PUT 请求,就可以在 Index 里面新增一条记录.比如,向/accounts/person发送请求,就可以新增一条人员记录. curl ...

  3. PyQuery库

    '''强大又灵活的网页解析库.如果你觉得正则写起来太麻烦,又觉得BeautifulSoup语法太难记,如果你熟悉jQuery的语法,那么PyQuery就是你的绝佳选择.'''from pyquery ...

  4. 在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?

    曼哈顿距离只计算水平或垂直距离,有维度的限制.另一方面,欧氏距离可用于任何空间的距离计算问题. 因为,数据点可以存在于任何空间,欧氏距离是更可行的选择.例如:想象一下国际象棋棋盘,象或车所 做的移动是 ...

  5. 在Git中添加一个项目

    首先保证Git服务器正确配置,管理员机器可正常连接并使用Git. 第一步:在服务器上新建一个项目仓库 切换到git用户: a@ubuntu:/home/git$ su - git $ cd /home ...

  6. 06_Hadoop分布式文件系统HDFS架构讲解

    mr  计算框架 假如有三台机器 统领者master 01  02  03  每台机器都有过滤的应用程序 移动数据 01机== 300M  >mr 移动计算  java程序传递给各个机器(mr) ...

  7. node错误中间件处理 express类 带有路由操作

    let express = require('express'); let app = new express(); let bodyParser = require('body-parser'); ...

  8. VS2015 + OPENCV + CUDA 安装流程

    VS2015  https://blog.csdn.net/guxiaonuan/article/details/73775519?locationNum=2&fps=1 OPENCV htt ...

  9. 将form数据转换成json对象自定义插件实现思路

  10. embed标签的flash层级太高问题

    因为客户要求,项目得兼容IE的兼容模式 页面到了flash都会遮挡底部悬浮的导航. 改变浮动窗口和embed的层级还是不可以.应该不是层级的关系. 最后百度解决方案:在embed标签内添加了wmode ...