本人写的是状压,先枚举可能结果,然后在用滚动数组dp但是 WA 了7个点,恳请各位 Dalao 查查错
#include<iostream>
#include<cstdio>
using namespace std;
struct node
{
long long k;
int num;
}str[1100];
int num;
int n,m,ans;
long long a[200];
int f[1100][1100][2];
void init(int k,long long a,int sum)
{
if(k>=m)
str[++num]=(node){a,sum};
else
{
init(k+1,a,sum);
init(k+3,a+(1ll<<k),sum+1);
}
}
void nextline()
{
char ch;
while(ch=getchar(), ch=='\n'||ch=='\r');
}
int main()
{
int i,j,k,q;
char c;
cin>>n>>m;nextline();
init(0,0,0);
for(i=1;i<=n;i++)
{
for(j=0;j<m;j++)
{
c=getchar();
if(c=='H')
a[i]+=1ll<<j;
}
nextline();
}
for(i=1;i<=n;i++)
{
for(j=1;j<=num;j++)
if(!(a[i]&str[j].k))
{
for(k=1;k<=num;k++)
if(!(a[i-1]&str[k].k))
if(!(str[j].k&str[k].k))
{
for(q=1;q<=num;q++)
if(i<2||!(a[i-2]&str[q].k))
if(!(str[j].k&str[q].k)&&!(str[k].k&str[q].k))
{
f[k][j][i%2]=max(f[k][j][i%2],f[q][k][(i-1)%2]+str[j].num);
if(i==n)ans=max(ans,f[k][j][i%2]);
}
}
}
}
cout<<ans;
getchar();
return 0;
}