zoukankan      html  css  js  c++  java
  • 【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 }
  • 相关阅读:
    python打印出当下的小时、分钟
    flask_ajax登录注册
    flask_SQlalchemy的复杂使用
    flask使用现有的数据表、在网页中显示数据
    js 的DOMdocument的使用
    pymysql的是使用
    通过ajax修改div id="div1" 的值
    关于django2.2使用xadmin的方法
    DOS windows 使用bat脚本获取 IP MAC 系统信息
    apache https 双向证书生成
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2588789.html
Copyright © 2011-2022 走看看