tangfanhao @ 2024-10-04 16:32:06
#include<bits/stdc++.h>
using namespace std;
int sum[2005],a[105],v[105][105],tot[105],dp[105][105][105],n,m,ans;
int main(){
n=0;
m=0;
scanf("%d%d",&n,&m);
getchar();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char sl;
sl=getchar();
if(sl=='H'){
a[i]=a[i] << 1;
a[i]+=1;
}else{
a[i]=a[i] << 1;
}
}
getchar();
}
for(int i=1;i<=n;i++){
for(int j=0;j<(1 << m);j++){
if(((j&a[i])==0)&&((j&(j << 1))==0)&&((j&(j << 2))==0)&&((j&(j >> 1))==0)&&((j&(j >> 2))==0)){
v[i][++tot[i]]=j;
}
sum[j]=sum[j >> 1]+(j & 1);
}
}
for(int i=1;i<=tot[1];i++){
dp[1][i][0]=sum[v[1][i]];
}
for(int i=1;i<=tot[2];i++){
for(int j=1;j<=tot[1];j++){
if((v[2][i]&v[1][j])==0){
dp[2][i][j]=sum[v[2][i]]+sum[v[1][j]];
}
}
}
if(n==1){
for(int i=1;i<=tot[1];i++){
ans=max(ans,dp[1][i][0]);
}
cout<<ans;
return 0;
}
for(int i=3;i<=n;i++){
for(int j=1;j<=tot[i];j++){
int s=v[i][j];
if((s&a[i])!=0){
continue ;
}
for(int k=1;k<=tot[i-1];k++){
int l=v[i-1][k];
if((s & l)==0&&(l&a[i-1])==0){
for(int op=1;op<=tot[i-2];op++){
int ll=v[i-2][op];
if((ll&a[i-2])==0&&(l & ll)==0&&(s & ll)==0){
dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][op]+sum[s]);
}
}
}
}
}
}
for(int j=1;j<=tot[n];j++){
for(int k=1;k<=tot[n-1];k++){
ans=max(ans,dp[n][j][k]);
}
}
cout<<ans;
return 0;
}
记录 wa#1,就是样例
by tangfanhao @ 2024-10-04 16:32:46
90pts
by wallace_QwQ @ 2024-11-01 23:32:30
关O2试一下 @tangfanhao