123456a01 @ 2023-07-10 19:11:57
#include<bits/stdc++.h>
using namespace std;
int n,m,mp[102],num[200],a[102][200],f[102][200][200];
inline int maxx(int x,int y){
return x>y?x:y;
}
void pre(){
for(int k=1;k<=n;k++){
for(int i=0;i<(1<<m);i++){
if((i&mp[k])||(i&(i<<1))||(i&(i<<2))) continue;
a[k][++a[k][0]]=i;
if(num[i]||(!i)) continue;
for(int j=0;j<m;j++){
if(i&(1<<j)) num[i]++;
}
}
}
}
int main(){
char c;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
getchar();
for(int j=1;j<=m;j++){
c=getchar();
mp[i]=(mp[i]<<1)|(c=='H');
}
}
pre();
for(int i=1;i<=a[1][0];i++) f[1][i][0]=num[a[1][i]];
if(n==1){
int x=0;
for(int i=1;i<=a[1][0];i++) x=maxx(x,f[1][i][0]);
printf("%d",x);
return 0;
}
for(int i=1;i<=a[2][0];i++){
for(int j=1;j<=a[1][0];j++){
if(!(a[2][i]&a[1][j])) f[2][i][j]=f[1][j][0]+num[a[2][i]];
}
}
for(int i=3;i<=n;i++){
for(int j=1;j<=a[i][0];j++){
for(int s1=1;s1<=a[i-1][0];s1++){
if(a[i][j]&a[i-1][s1]) continue;
for(int s2=1;s2<=a[i-2][0];s2++){
if((a[i][j]&a[i-2][s2])||(a[i-1][s1]&a[i-2][s2])) continue;
f[i][j][s1]=maxx(f[i][j][s1],f[i-1][s1][s2]+num[a[i][j]]);
}
}
}
}
int x=0;
for(int i=1;i<=a[n][0];i++)
for(int j=1;j<=a[n-1][0];j++)
x=maxx(x,f[n][i][j]);
printf("%d",x);
return 0;
}
by Futurecome @ 2023-07-10 19:24:15
尼玛
by Futurecome @ 2023-07-10 19:26:05
让我康康
by 123456a01 @ 2023-07-11 08:03:38
已找到问题,把getchar()换成scanf(“%s”)即可,已AC,此帖结