#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
最新推荐文章于 2020-03-17 16:39:51 发布