poj 2836

題目鏈接: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]);
    }
}


發佈了19 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章