#include<stdio.h>
#define INF 0x3f3f3f3f
#define max(x,y) ((x>y)?(x):(y))
#define min(x,y) ((x>y)?(y):(x))
int ab(int x)
{
return x>0?x:-x;
}
int x[20],y[20],dp[1<<18];
struct node
{
int cover;
int area;
}dot[300];
int main()
{
int i,j,k,num,n,w,h;
while(~scanf("%d",&n)&&n)
{
num=0;
for(i=0;i<n;i++)
scanf("%d%d",&x[i],&y[i]);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
w=ab(x[i]-x[j])==0?1:ab(x[i]-x[j]);
h=ab(y[i]-y[j])==0?1:ab(y[i]-y[j]);
dot[num].area=w*h;
dot[num].cover=0;
for(k=0;k<n;k++)
{
if(x[k]<=max(x[i],x[j])&&x[k]>=min(x[i],x[j])&&y[k]<=max(y[i],y[j])&&y[k]>=min(y[i],y[j]))
dot[num].cover|=(1<<k);
}
num++;
}
}
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(i=0;i<1<<n;i++)
{
if(dp[i]==INF)
continue;
for(j=0;j<num;j++)
{
dp[i|dot[j].cover]=min(dp[i|dot[j].cover],dp[i]+dot[j].area);
}
}
printf("%d\n",dp[(1<<n)-1]);
}
return 0;
}poj 2836 Rectangular Covering
最新推荐文章于 2024-07-02 15:06:10 发布
本文介绍了一种解决矩形覆盖问题的方法,通过计算不同矩形的面积并使用动态规划来找出最小覆盖区域所需的总面积。文章详细展示了如何枚举所有可能的矩形,并通过位运算记录每个矩形覆盖的点,最终实现对整个区域的有效覆盖。
989

被折叠的 条评论
为什么被折叠?



