没想出什么简单方法,直接用分两种情况递归了。递归里面分成两种情况,一种是这行翻转,一种是这行不变,从小行到大行开始递归,一直递归到最后一行然后计该情况下的1的数量,然后更新result。每次递归最后要把这种情况变了的给还原。
//
// Created by Frank Yan on 2017/12/19.
//
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <string>
#include <vector>
#include <queue>
using namespace std;
int m,n,result;
int a[11][3001];
int count(){
int tn,sum=0;
for(int i=0;i<n;i++){
tn = 0;
for(int j=0;j<m;j++)
if(a[j][i]) tn++;
if(m-2*tn>0) tn = m-tn;
sum+=tn;
}
return sum;
}
void recursion(int t){
int temp = 0;
if(t<m){
recursion(t+1);
if (result ==m*n) return ;
for(int j=0;j<n;j++)
a[t][j]=!a[t][j];
recursion(t+1);
if(result == m*n) return ;
for(int j=0;j<n;j++) //还原
a[t][j]=!a[t][j];
}
else{
temp = count();
//cout<<temp<<endl;
if(temp>result)
result = temp;
return ;
}
}
int problem32(){
while(cin>>m>>n){
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
result=0;
recursion(1);
cout<<result<<endl;
}
}