【XSY2693】景中人 区间DP
题目描述
平面上有\(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的更多相关文章
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【POJ-1390】Blocks 区间DP
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- BZOJ1055: [HAOI2008]玩具取名[区间DP]
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1588 Solved: 925[Submit][Statu ...
- poj2955 Brackets (区间dp)
题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
- 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 ...
- 区间dp总结篇
前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...
- Uva 10891 经典博弈区间DP
经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...
随机推荐
- vue中使用sass
1.npm安装 npm install sass-loader --save-dev npm install node-sass --save-dev //--save写入到package.json里 ...
- [2018福大至诚软工助教]alpha阶段小结
[2018福大至诚软工助教]alpha阶段小结 一.得分 1. 冲刺(7次 Scrum) 150分 1)第1篇(25分) 项目 评分标准 各个成员在 Alpha 阶段认领的任务 (6分)视详细程度给分 ...
- Zabbix appliance manual
https://www.zabbix.com/documentation/4.0/manual/appliance If the appliance fails to start up in Hype ...
- IdentityServer4【Topic】之StartUp中的配置
Startup 身份服务器是中间件和服务的组合.所有的配置都是在启动类中完成的. Configuring services 通过调用如下代码在DI(dependency inject,依赖注入)中添加 ...
- Git命令以及常见注意事项
命令: git init -> 初始化一个git仓库 git clone -> 克隆一个本地库 git pull -> 拉取服务器最新代码 git fetch –p -> 强行 ...
- 1 Servlet 简介
1 Servlet是sun公司提供的一门用于开发动态web资源的技术.用户若用Java技术开发一个动态web资源或者网页,需要完成以下2个步骤:① 编写一个Java类,实现servlet接口② 把开发 ...
- C# Note30: 网络爬虫
用C#实现网络爬虫(一) 用C#实现网络爬虫(二) 基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看) 基于C#.NET的高端智能化网络爬虫(二)(攻破携程网) C#获取网页内容的三种方式
- bootStrap的使用
1.首先要打开bootstrap的官网 点进去 2你会看到下面这样一个页面里面有很多组件 这里面的代码是实现组件功能的核心代码,还不能直接使用,要引入相关的js css 我们要在起步中下载相关的页面下 ...
- Django模板渲染
一 . 语法 # 关于模板渲染只需要记住两种语法就可以: 1.{{ }} # 里面写变量 2.{% %} # 里面写与逻辑相关的,比如for循环 二 . 变量名 在django的模板语言中按照语法: ...
- delphi中adoquery控件中某个字段Onvalidate事件的用法?
procedure TForm2.ADOQuery1TestFieldValidate(Sender: TField);begin// Sender就是当前字段,可以在这里对Sender字段进行各种操 ...