POJ 2836 Rectangular Covering

点击打开链接

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值