代码很好理解的:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[101],p,dp[101][101][101],ans;
char c[101][11];
void work(){
for(int i=1;i<(1<<n);i++){
if((i&(i<<1))||(i&(i<<2))) continue;
p++;
a[p]=i;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",c[i]+1);
work();
for(int i=1;i<=n;i++){
for(int j=1;j<=p;j++){
int s=0,t=a[j];
while(t){
t&=(t-1);
s++;
}
for(int z=1;z<=p;z++){
if(a[j]&a[z]) continue;
int maxs=0;
for(int k=1;k<=p;k++){
if((a[j]&a[k])||(a[z]&a[k])) continue;
maxs=max(maxs,dp[i][z][k]);
}
dp[i][j][z]=maxs+s;
}
}
}
for(int i=1;i<=p;i++){
for(int j=1;j<=p;j++) ans=max(ans,dp[n][i][j]);
}
printf("%d",ans);
return 0;
}