HDU4739Zhuge Liang's Mines(状压)

链接

预处理出只有四个1的情况存入数组中 然后状压下

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 using namespace std;
 7 #define N 1050000
 8 int dp[2][N];
 9 int q[2][N];
10 int pt[N];
11 bool f[N];
12 struct node
13 {
14     int x,y;
15 }pp[25];
16 bool cmp(node a,node b)
17 {
18     if(a.x==b.x)
19     return a.y<b.y;
20     return a.x<b.x;
21 }
22 int main()
23 {
24     int n,i,j,k,o,p[25][2];
25     while(scanf("%d",&n)!=EOF)
26     {
27         if(n==-1)
28         break;
29         memset(dp,0,sizeof(dp));
30         for(i = 0; i < n ; i++)
31         scanf("%d%d",&pp[i].x,&pp[i].y);
32         sort(pp,pp+n,cmp);
33         k = 0;
34         for(i = 0 ; i < 1<<n ; i++)
35         {
36             o = 0;
37             for(j = 0 ; j < n ; j++)
38             {
39                 if(i&(1<<j))
40                 {
41                     o++;
42                     p[o][0] = pp[j].x;
43                     p[o][1] = pp[j].y;
44                 }
45             }
46             if(o==4)
47             {
48                 int x1,x2;
49                 if(p[1][0]==p[2][0]&&p[3][0]==p[4][0]&&p[2][1]==p[4][1]&&p[1][1]==p[3][1])
50                 {
51                     x1 = p[2][1]-p[1][1];
52                     x2 = p[3][0]-p[1][0];
53                     if(x1==x2)
54                     {
55                         k++;
56                         q[1][k] = i;
57                         dp[1][i] = 4;
58                         pt[k] = i;
59                     }
60                 }
61             }
62         }
63         int tt = k;
64         o=k;
65         for(i = 2; i <= n/4+1 ; i++)
66         {
67             k = tt;tt=0;
68             for(j = 1 ; j <= k ; j++)
69             {
70                 for(int g = 1 ; g <= o ; g++)
71                 {
72                     if(q[(i-1)%2][j]&pt[g])
73                     continue;
74                     int x = q[(i-1)%2][j]+pt[g];
75                     dp[i%2][x] = max(dp[i%2][x],dp[(i-1)%2][q[(i-1)%2][j]]+4);
76                     if(!f[x])
77                     {
78                         f[x] = 1;
79                         tt++;
80                         q[i%2][tt] = x;
81                     }
82                 }
83             }
84         }
85         int ans=0;
86         for(i = 0 ; i < 1<<n ; i++)
87         {
88             ans = max(ans,max(dp[0][i],dp[1][i]));
89         }
90         printf("%d\n",ans);
91     }
92     return 0;
93 }
View Code

 

posted @ 2013-09-15 22:26  _雨  阅读(498)  评论(0编辑  收藏  举报