思路:
- 由于n比较小,可以对行dfs枚举出所有状态,然后对每一列贪心选择,如果一列1比较多,则此列不翻转,反之如果0比较多则翻转就好了。
代码:
#include<iostream>
#include<cstdio>
#include<set>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int Max_n=1e4+10;
int n,m;
bool s[20][Max_n];
int ans;
void dfs(int k){
if(k==n+1){
int sum=0;
for(int i=1;i<=m;i++){
int c=0;
for(int j=1;j<=n;j++)
if(s[j][i]==1)c++;
sum+=max(c,n-c);
}
ans=max(ans,sum);
return;
}
dfs(k+1);
for(int i=1;i<=m;i++) //对第k行进行翻转处理
s[k][i]=!s[k][i];
dfs(k+1);
}
int main()
{
while(~scanf("%d%d",&n,&m)&&n+m){
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&s[i][j]);
}
}
ans=0;
dfs(1);
printf("%d\n",ans);
}
return 0;
}