#include<stdio.h> #include<string.h> int dp[2][202][202]; int s[202],c[202],origmap[202]; int main() { int i,j,n,m; int ch; while(scanf("%d%d",&n,&m)!=EOF) { memset(origmap,0,sizeof(origmap)); memset(s,0,sizeof(s)); memset(c,0,sizeof(c)); for(i=0;i<n;i++) { getchar(); for(j=0;j<m;j++) { scanf("%d",&ch); if(ch==0) origmap[i]+=(1<<j); } } int num=0; for(i=0;i<(1<<m);i++) { int t=i; if(i&(i<<2)) continue; c[num]=t%2; while(t=(t>>1)) c[num]+=t%2; s[num++]=i; } memset(dp,-1,sizeof(dp)); int roll=0; for(i=0;i<n;i++) { for(j=0;j<num;j++) { if(s[j]&origmap[i]) continue; if(i==0) dp[roll][j][0]=c[j]; else { for(int k=0;k<num;k++) { if((s[j]&(s[k]<<1))||(s[j]&(s[k]>>1))) continue; for(int l=0;l<num;l++) { if(s[j]&s[l]) continue; if(s[k]&(s[l]<<1)) continue; if(s[k]&(s[l]>>1)) continue; if(dp[(roll+1)%2][k][l]==-1) continue; if(dp[roll][j][k]<dp[(roll+1)%2][k][l]+c[j]) dp[roll][j][k]=dp[(roll+1)%2][k][l]+c[j]; } } } } roll=(roll+1)%2; } int max=0; roll=(roll+1)%2; for(i=0;i<num;i++) for(j=0;j<num;j++) if(max<dp[roll][i][j]) max=dp[roll][i][j]; printf("%d ",max); } return 0; }