RT,本地AC,评测90分WA样例,在线IDE也是WA
样例本地输出6,在线IDE输出7
#include<bits/stdc++.h>
using namespace std;
char s[101][11];
int a[101];
long long dp[3][1024][1024];
int sum[1024];
int getsum(int x)
{
int cnt=0;
while(x){
x-=x&(-x);
cnt++;
}
return cnt;
}
int main()
{
for(int i=0;i<1024;i++)
sum[i]=getsum(i);
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
getchar();
for(int j=1;j<=m;j++)
{
scanf("%c",&s[i][j]);
a[i]*=2;
if(s[i][j]=='H')a[i]++;
}
}
for(int u=0;u<(1<<m);u++)
{
if((u&a[1])||(u&(u<<1))||(u&(u<<2)))continue;
dp[1][u][0]=sum[u];
}
for(int u=0;u<(1<<m);u++)
{
if((u&a[1])||(u&(u<<1))||(u&(u<<2)))continue;
for(int v=0;v<(1<<m);v++)
{
if((v&a[2])||(v&(v<<1))||v&(v<<2)||(v&u))continue;
dp[2][v][u]=sum[v]+sum[u];
}
}
for(int i=3;i<=n;i++)
{
for(int u=0;u<(1<<m);u++)
{
if((u&a[i])||(u&(u<<1))||(u&(u<<2)))continue;
for(int v=0;v<(1<<m);v++)
{
if((v&a[i-1])||(v&(v<<1))||(v&(v<<2))||(v&u))continue;
for(int w=0;w<(1<<m);w++)
{
if((w&a[i-2])||(w&(w<<1))||(w&(w<<2))||(w&v)||(w&u))continue;
dp[i%3][u][v]=max(dp[i%3][u][v],dp[(i-1)%3][v][w]+sum[u]);
}
}
}
}
long long ans=0;
for(int u=0;u<(1<<m);u++)
for(int v=0;v<(1<<m);v++)
ans=max(ans,dp[n%3][u][v]);
printf("%lld\n",ans);
return 0;
}