• 【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 }
  • 相关阅读:
    【区间DP&&记忆化搜索】乘法游戏
    洛谷P1608路径统计
    2021省选游记
    涂色计划P4170
    01迷宫及路径记录(DFS&&BFS)
    [YBTOJ递推算法强化训练4]序列个数
    C++关于string 的优先队列以及重载运算符
    浅谈C++STL容器
    集合的划分
    图的表示
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2587334.html
Copyright © 2020-2023  润新知