【POJ】1185 炮兵阵地

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 using namespace std;
  5 #define MAXN 110
  6 #define MAXM 66
  7 char s[MAXN][MAXM];
  8 int n,m,size;
  9 int dp[MAXN][MAXM][MAXM];
 10 int h[MAXN],a[MAXN],cnt[MAXN];
 11 inline bool OK(int x)
 12 {
 13     if(x&(x<<1))
 14         return false;
 15     if(x&(x<<2))
 16         return false;
 17     return true;
 18 }
 19 int One(int x)
 20 {
 21     int ans;
 22     for(ans=0;x;x>>=1)
 23     {
 24         if(x&1)
 25             ans++;
 26     }
 27     return ans;
 28 }
 29 void Init()
 30 {
 31     int i;
 32     for(i=size=0;i<(1<<m);i++)
 33     {
 34         if(OK(i))
 35         {
 36             a[size]=i;
 37             cnt[size++]=One(i);
 38         }
 39     }
 40 }
 41 inline bool Unfit(int x,int y)
 42 {
 43     return h[x]&a[y];
 44 }
 45 inline bool Two(int x,int y)
 46 {
 47     return a[x]&a[y];
 48 }
 49 void DoIt()
 50 {
 51     int i,j,k,t,ans;
 52     memset(dp,0,sizeof(dp));
 53     for(i=0;i<size;i++)
 54     {
 55         if(!Unfit(1,i))
 56             dp[1][i][0]=cnt[i];
 57     }
 58     for(i=2;i<=n;i++)
 59     {
 60         for(j=0;j<size;j++)
 61         {
 62             if(Unfit(i,j))
 63                 continue;
 64             for(k=0;k<size;k++)
 65             {
 66                 if(Unfit(i-1,k)||Two(j,k))
 67                     continue;
 68                 for(t=0;t<size;t++)
 69                 {
 70                     if(Unfit(i-2,t)||Two(t,k)||Two(t,j))
 71                         continue;
 72                     dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][t]+cnt[j]);
 73                 }
 74             }
 75         }
 76     }
 77     for(ans=0,i=1;i<=n;i++)
 78     {
 79         for(j=0;j<size;j++)
 80         {
 81             for(k=0;k<size;k++)
 82                 ans=max(ans,dp[i][j][k]);
 83         }
 84     }
 85     printf("%d\n",ans);
 86 }
 87 int main()
 88 {
 89     int i,j;
 90     while(~scanf("%d%d",&n,&m))
 91     {
 92         for(i=1;i<=n;i++)
 93         {
 94             h[i]=0;
 95             for(j=1;j<=m;j++)
 96             {
 97                 scanf(" %c",&s[i][j]);
 98                 if(s[i][j]=='H')
 99                     h[i]+=1<<(j-1);
100             }
101         }
102         Init();
103         DoIt();
104     }
105     return 0;
106 }
原文地址:https://www.cnblogs.com/DrunBee/p/2587334.html