114514xxx @ 2024-10-31 20:11:07
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int f[1<<11][1<<11][20];
int cnt[1<<11],sit[1<<11];
int num;
int a[205];
inline int get(int x){
int tot=0;
while(x){
if(x&1)++tot;
x>>=1;
}
return tot;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
char c;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;++j){
cin>>c;
a[i]<<=1;
a[i]|=(c=='H'?1:0);
}
}
for(int i=0;i<(1<<m);++i)
cnt[i]=get(i);
for(int i=0;i<(1<<m);i++)
for(int j=0;j<(1<<m);j++)
if(!(i&j || j&a[1] || j&a[2] || (i&(i<<1)) || (i&(i<<2)) || (j&(j<<1)) || (j&(j<<2))))
f[i][j][2]=cnt[i]+cnt[j];
for(int i=3;i<=n;i++){
for(int j=0;j<(1<<m);++j){
if(j&a[i-1] || (j&(j<<1)) || (j&(j<<2)))continue;
for(int k=0;k<(1<<m);++k){
if(k&a[i] || k&j || (k&(k<<1)) || (k&(k<<2)))continue;
for(int l=0;l<(1<<m);++l){
if(l&a[i-2] || l&k || k&j || (l&(l<<1)) || (l&(l<<2)))continue;
f[j][k][i]=f[j][k][i]>(f[l][j][i-1]+cnt[k])?f[j][k][i]:(f[l][j][i-1]+cnt[k]);
}
}
}
}
int ans=0;
for(int i=0;i<(1<<m);++i){
for(int j=0;j<(1<<m);++j){
if(i&j||i&a[n-1]||j&a[n])continue;
ans=max(f[i][j][n],ans);
}
}
cout<<ans;
}
by 114514xxx @ 2024-10-31 20:50:36
此贴终
if(!(i&j || j&a[1] || j&a[2] || (i&(i<<1)) || (i&(i<<2)) || (j&(j<<1)) || (j&(j<<2))))
改为
if(!(i&j || i&a[1] || j&a[2] || (i&(i<<1)) || (i&(i<<2)) || (j&(j<<1)) || (j&(j<<2))))
即可