B 点击打开链接
#include<stdio.h>
#include<string.h>
#include<stack>
#include<string>
#include<math.h>
#include<queue>
#include<set>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
#define LL __int64
#define inf 1999999999
#define N 1010
#define mod 1000000007
struct node{
int s,c;//s表示矩形的面积,c表示包括的点的状态
}a[15*15];
int dp[1<<15];//dp[i] i表示状态
struct point{
int x,y;
}p[17];
int main()
{
int i,j,n,m,x,y,k;
while(scanf("%d",&n),n)
{
m=0;
memset(a,0,sizeof(a));
for(i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);
for(i=1;i<=n;i++)
{
/*因为每个矩形要至少包含两个点,所以先把每两个点组成的矩形表示出来;*/
for(j=1;j<i;j++)
{
int xx=abs(p[i].x-p[j].x);
int yy=abs(p[i].y-p[j].y);
if(!xx) xx=1;//!!!!!!
if(!yy) yy=1;//!!!!!!
a[++m].s=xx*yy;
for(k=1;k<=n;k++)
{
if(p[k].x>=min(p[i].x,p[j].x)&&p[k].x<=max(p[i].x,p[j].x)&&p[k].y>=min(p[i].y,p[j].y)&&p[k].y<=max(p[i].y,p[j].y))
a[m].c|=1<<(k-1);//如果这个点在这个矩阵里,就加进去
}
}
}
//初始化dp
for(i=1;i<(1<<n);i++) dp[i]=inf; dp[0]=0;//一个点都没有包括面积是0
for(i=0;i<(1<<n);i++)//dp过程
{
if(dp[i]==inf) continue;//原来状态不能是inf
for(j=1;j<=m;j++)
dp[i|a[j].c]=min(dp[i|a[j].c],dp[i]+a[j].s);//试图把第j个矩阵的状态加进去
}
printf("%d\n",dp[(1<<n)-1]);//dp[(1<<n)-1]也就是dp[1111....1111(2进制n个1)]包括所有的点的状态
}
return 0;
}