/* 炮兵阵地*/
/*这道题想了很长时间,终于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;
}
炮兵阵地
最新推荐文章于 2022-04-08 14:55:48 发布