【POJ】1038 Bugs Integrated, Inc.

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<vector>
  4 #include<algorithm>
  5 #define MAXN 160
  6 #define MAXM 20
  7 #define MAXL 280
  8 using namespace std;
  9 int n,m;
 10 bool land[MAXN][MAXM];
 11 int put[MAXL][MAXM],cnt[MAXL],tmp[MAXM],size;
 12 vector<int>G[MAXL];
 13 int dp[2][MAXL][MAXL];
 14 bool OK()
 15 {
 16     int i,j,k,res;
 17     for(i=res=0;i<m;i++)
 18     {
 19         if(tmp[i])
 20         {
 21             for(j=i;j<m&&tmp[i]==tmp[j];j++);
 22             k=j-i;
 23             if(tmp[i]==1)
 24             {
 25                 if(k%3)
 26                     return false;
 27                 res+=k/3;
 28             }
 29             else
 30             {
 31                 if(k&1)
 32                     return false;
 33                 res+=k>>1;
 34             }
 35             i=j-1;
 36         }
 37     }
 38     cnt[size]=res;
 39     return true;
 40 }
 41 void DFS(int now)
 42 {
 43     if(now==m)
 44     {
 45         if(OK())
 46             memcpy(put[size++],tmp,sizeof(tmp));
 47     }
 48     else
 49     {
 50         int i;
 51         for(i=0;i<3;i++)
 52         {
 53             tmp[now]=i;
 54             DFS(now+1);
 55         }
 56     }
 57 }
 58 bool Upper(int x,int y)
 59 {
 60     int i;
 61     for(i=0;i<m;i++)
 62     {
 63         if(put[x][i]&&put[y][i])
 64             return false;
 65     }
 66     return true;
 67 }
 68 void Init()
 69 {
 70     int i,j;
 71     size=0;
 72     memset(land,false,sizeof(land));
 73     memset(dp,0,sizeof(dp));
 74     DFS(0);
 75     for(i=0;i<size;i++)
 76     {
 77         G[i].clear();
 78         for(j=0;j<size;j++)
 79         {
 80             if(Upper(i,j))
 81                 G[i].push_back(j);
 82         }
 83     }
 84 }
 85 bool Unfit(int r,int x)
 86 {
 87     int i;
 88     for(i=0;i<m;i++)
 89     {
 90         if(land[r][i]&&put[x][i])
 91             return true;
 92     }
 93     return false;
 94 }
 95 bool First(int x)
 96 {
 97     int i;
 98     for(i=0;i<m;i++)
 99     {
100         if(put[x][i]==2||put[x][i]&&land[1][i])
101             return true;
102     }
103     return false;
104 }
105 bool Three(int x,int y,int k)
106 {
107     int i;
108     for(i=0;i<m;i++)
109     {
110         if(put[x][i]==2)
111         {
112             if(put[y][i]||land[k][i])
113                 return true;
114         }
115     }
116     return false;
117 }
118 void DoIt()
119 {
120     int i,j,k,t,x,y,ans;
121     for(ans=i=0;i<size;i++)
122     {
123         if(Unfit(2,i)||First(i))
124             continue;
125         dp[0][i][0]=cnt[i];
126     }
127     for(i=3;i<=n;i++)
128     {
129         for(j=0;j<size;j++)
130         {
131             if(Unfit(i,j))
132                 continue;
133             for(k=0;k<G[j].size();k++)
134             {
135                 x=G[j][k];
136                 if(Unfit(i-1,x)||Unfit(i-1,j))
137                     continue;
138                 for(t=0;t<G[x].size();t++)
139                 {
140                     y=G[x][t];
141                     if(Unfit(i-2,y)||Unfit(i-2,x)||Three(j,y,i-2))
142                         continue;
143                     dp[i&1][j][x]=max(dp[i&1][j][x],dp[(i-1)&1][x][y]+cnt[j]);
144                 }
145                 ans=max(ans,dp[i&1][j][x]);
146             }
147         }
148     }
149     printf("%d\n",ans);
150 }
151 int main()
152 {
153     int c,q,x,y;
154     scanf("%d",&c);
155     while(c--)
156     {
157         scanf("%d%d%d",&n,&m,&q);
158         Init();
159         while(q--)
160         {
161             scanf("%d%d",&x,&y);
162             land[x][y-1]=true;
163         }
164         DoIt();
165     }
166     return 0;
167 }
原文地址:https://www.cnblogs.com/DrunBee/p/2588789.html