炮兵阵地

来源:互联网 发布:喀秋莎软件使用ppt 编辑:程序博客网 时间:2024/04/28 13:11
/* 炮兵阵地*//*这道题想了很长时间,终于AC了*/include <iostream>#include <cstring>#include <cstdio>using namespace std;int dp[109][100][100],state[190],map[109],num;void initdp(int n){    num = 0;    for(int i=0;i<(1<<n);i++)    if((!(i&(i<<1))&&!(i&(i<<2))))state[num++] = i;}int sum(int n){    int ans = 0;    while(n)    {        if(n % 2 == 1)            ans++;        n/=2;    }    return ans;}int main(){    int T,n,m;char ch;    //freopen("input.txt","r",stdin);    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        memset(map,0,sizeof(map));        for(int i=0;i<n;i++)        for(int j=0;j<m;j++)        {            cin >> ch;            if(ch == 'H')map[i] = map[i]|(1<<j);        }        initdp(m);        memset(dp,-1,sizeof(dp));        for(int i=0;i<num;i++)            if(!(map[0]&state[i]))                dp[0][i][0] = sum(state[i]);            for(int i=1;i<n;i++)            {                for(int j=0;j<num;j++)                {                    if(map[i]&state[j])continue;                    for(int k=0;k<num;k++)                    {                         if(state[k]&state[j])continue;                         for(int p=0;p<num;p++)                         {                             if(state[p]&state[j])continue;                             if(state[p]&state[k])continue;                             if(dp[i-1][k][p]==-1)continue;                             dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][p]+sum(state[j]));                         }                    }                }            }            int ans =0;            if(n==0&&m==0){puts("0");continue;}            for(int i=0;i<num;i++)                for(int j=0;j<num;j++)                ans = max(ans,dp[n-1][i][j]);                printf("%d\n",ans);    }    return 0;}

0 0