POJ2836 Rectangular Covering(状压DP)
题目是平面上n个点,要用若干个矩形盖住它们,每个矩形上至少要包含2个点,问要用的矩形的面积和最少是多少。
容易反证得出每个矩形上四个角必定至少覆盖了两个点。然后就状压DP:
- dp[S]表示覆盖的点集为S要用的最少矩形面积
转移我一开始是未覆盖的点和已覆盖的点构成一个矩形来转移,这是错的,因为这样子的结果是所有矩形都相连的最小面积和。
正确的是枚举还未被覆盖的矩形来转移。转移我用我为人人+队列。
有一点要注意的是,覆盖(0,0)和(0,2)两点要用的矩形是1*2,所以要特判一下两点斜率0或不存在时构成的矩形。
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define INF (1<<29) bool isIn(int x1,int y1,int x2,int y2,int x,int y){
if(x1>x2) swap(x1,x2);
if(y1>y2) swap(y1,y2);
return x1<=x && x<=x2 && y1<=y && y<=y2;
}
int area(int x1,int y1,int x2,int y2){
if(x1==x2) ++x2;
if(y1==y2) ++y2;
if(x1>x2) swap(x1,x2);
if(y1>y2) swap(y1,y2);
return (x2-x1)*(y2-y1);
}
int d[<<],sta[][];
bool inque[<<];
int main(){
int n,x[],y[];
while(~scanf("%d",&n) && n){
for(int i=; i<n; ++i) scanf("%d%d",x+i,y+i);
for(int i=; i<(<<n); ++i) d[i]=INF;
queue<int> que;
memset(inque,,sizeof(inque));
for(int i=; i<n; ++i){
for(int j=i+; j<n; ++j){
int s=;
for(int k=; k<n; ++k){
if(isIn(x[i],y[i],x[j],y[j],x[k],y[k])) s|=(<<k);
}
sta[i][j]=sta[j][i]=s;
if(d[s]>area(x[i],y[i],x[j],y[j])){
d[s]=area(x[i],y[i],x[j],y[j]);
if(!inque[s|sta[i][j]]){
inque[s]=;
que.push(s);
}
}
}
}
while(!que.empty()){
int s=que.front(); que.pop();
for(int i=; i<n; ++i){
for(int j=i+; j<n; ++j){
if(((s>>i)&) && ((s>>j)&)) continue;
if(d[s|sta[i][j]]>d[s]+area(x[i],y[i],x[j],y[j])){
d[s|sta[i][j]]=d[s]+area(x[i],y[i],x[j],y[j]);
if(!inque[s|sta[i][j]]){
inque[s|sta[i][j]]=;
que.push(s|sta[i][j]);
}
}
}
}
inque[s]=;
}
printf("%d\n",d[(<<n)-]);
}
return ;
}
POJ2836 Rectangular Covering(状压DP)的更多相关文章
- POJ 2836 Rectangular Covering (状压DP)
题意:平面上有 n (2 ≤ n ≤ 15) 个点,现用平行于坐标轴的矩形去覆盖所有点,每个矩形至少盖两个点,矩形面积不可为0,求这些矩形的最小面积. 析:先预处理所有的矩形,然后dp[s] 表示 状 ...
- 【POJ3254】Corn Fields 状压DP第一次
!!!!!!! 第一次学状压DP,其实就是运用位运算来实现一些比较,挺神奇的.. 为什么要发“!!!”因为!x&y和!(x&y)..感受一下.. #include <iostre ...
- poj3254 Corn Fields (状压DP)
http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- poj3254状压DP入门
G - 状压dp Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:65536KB 64bit ...
- 状压dp(状态压缩&&dp结合)学习笔记(持续更新)
嗯,作为一只蒟蒻,今天再次学习了状压dp(学习借鉴的博客) 但是,依旧懵逼·································· 这篇学习笔记是我个人对于状压dp的理解,如果有什么不对的 ...
- 状态压缩动态规划 状压DP
总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...
- poj 3254Corn Fields (入门状压dp)
Farmer John has purchased a lush ≤ M ≤ ; ≤ N ≤ ) square parcels. He wants to grow some yummy corn fo ...
- POJ 1684 Corn Fields(状压dp)
描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...
- POJ 3254 - Corn Fields - [状压DP水题]
题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...
随机推荐
- loadrunner---<三>---菜鸟对Browser Emulation的思考
之前在一个web是项目做性能测试,发现controller中场景运行的时候,mrdv.exe内存所耗内存在不断增加,最后报错停止了 not enough memory for new buffer i ...
- Forth scrum meeting - 2015/10/29
今天下午,我们终于要到了MOOC服务器端开发人员的联系方式,于是我们小组派了三名同学去实验室与他们进行了交流,并咨询了他们一些关于API接口的问题.他们也对我们这个客户端的开发提出了一些建议. 开发团 ...
- 转SISD、MIMD、SIMD、MISD计算机的体系结构的Flynn分类法
1. 计算平台介绍 Flynn于1972年提出了计算平台的Flynn分类法,主要根据指令流和数据流来分类,共分为四种类型的计算平台,如下图所示: 单指令流单数据流机器(SISD) SISD机器是一种传 ...
- VMware的四种网络连接方式
mkdir /mn/cdrom mount /dev/cdrom /mnt/cdrom Bridge:这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡 绑定两个不同地址类 ...
- java 异常处理 Throwable Error 和Exception
Java异常类层次结构图: 异常的英文单词是exception,字面翻译就是“意外.例外”的意思,也就是非正常情况.事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误. 比如使用 ...
- String to Integer
Implement function atoi to convert a string to an integer. If no valid conversion could be performed ...
- Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. C ...
- css 属性
部分属性在firefox 中添加-moz- safari 以及chrome 加上-webkit- opera 加上-o- ie9里可能需要-ms- jquery 中的css 操作 和一般的cs ...
- windows下不打开浏览器访问网页的方法
我们打开电脑,大多时候都是打开浏览器在上网.这都是通过浏览器来实现的,然而windows下有没有办法不通过浏览器也可以像linux那样达到访问网页的目的呢?这当然少不了批处理或者VBScript.然而 ...
- iOS 一个工程中引用其他工程时编译的Architecture问题
当引用了其他工程时,在编译时报错,提示你编译指令架构不对,你需要查看一下这几个工程的Architecture部分是否又冲突,比如主工程设置Valid Architecture为armv7 而 另一个子 ...