淸梣ling @ 2021-07-03 17:14:26
本人写的是状压,先枚举可能结果,然后在用滚动数组dp但是
#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;
}
by 淸梣ling @ 2021-07-03 17:15:23
最后的getchar是调试用的,交的时候去掉了