题目链接:http://poj.org/problem?id=2836
题目类型:状压dp
参考大神的代码写的,状压dp还是不太熟练。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int dp[1<<15];
int a[15],b[15];
int cover[15][15];
int area[15][15];
int main()
{
int n;
int x,y;
while(~scanf("%d",&n),n)
{
memset(dp,0,sizeof(dp));
memset(cover,0,sizeof(cover));
memset(area,0,sizeof(area));
int inf=1<<n;
for(int i = 0; i < n; i ++)
scanf("%d%d",&a[i],&b[i]);
for(int i = 0; i < n;i ++)
for(int j = 0; j < n;j ++)
{
if(i == j)
continue;
int lx = min(a[i],a[j]);
int dy = min(b[i],b[j]);
int rx = max(a[i],a[j]);
int uy = max(b[i],b[j]);
for(int k=0;k<n;k++)
{
if(a[k] >= lx && a[k] <= rx && b[k] <= uy && b[k] >= dy)
cover[i][j]|=1<<k;
}
lx=rx-lx?rx-lx:1;
uy=uy-dy?uy-dy:1;
area[i][j]=lx*uy;
}
memset(dp, 0x7, sizeof(dp));
dp[0] = 0;
for( int k = 0; k < inf; k ++)
{
for( int i = 0; i < n; i ++)
{
for( int j = 0; j < i; j ++)
{
int s = k | cover[i][j];
if(dp[s] > dp[k] + area[i][j])
dp[s] = dp[k] + area[i][j];
}
}
}
printf("%d\n",dp[inf-1]);
}
}