下面是我自己做的,用时1.7S,可以直接学习上面的,用时1.1S
#include<iostream>
#include<cstdio>
#include<fstream>
#include<queue>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#define MAX 11000
#define INF 10000000
using namespace std;
int C, R;
int cook[20][MAX];
int ans = 0;
//翻面
void Flip(int x){
for(int i=0; i<R; i++){
if(cook[x][i] == 0)
cook[x][i] = 1;
else
cook[x][i] = 0;
}
}
//对cook深搜
void Dfs(int x, bool fl){
//翻到底部时,统计最多能翻过来几个
if(x == C){
int sum = 0;//总数
//统计每一列,然后相加
for(int i=0; i<R; i++){
int a = 0; //计1
for(int j=0; j<C; j++){
if(cook[j][i])
a++;
}
sum += max(a,C-a);
}
ans = max(ans,sum);
return ;
}
//翻面
if(fl){
Flip(x);
}
Dfs(x+1,true);
Dfs(x+1,false);
//还原
if(fl){
Flip(x);
}
}
void Solve(){
Dfs(0,0);
Dfs(0,1);
cout << ans << endl;
}
//测试函数
int main(){
ifstream in ("D:\\钢铁程序员\\程序数据\\035翻煎饼AOJ0525.txt");//从文件读取数据流,省去手动输入的麻烦
if(!in){//读取如果失败
cout << "ERROR" << endl;
}
while(in >> C >> R){
if(C==0 && R==0)break;
for(int i=0; i<C; i++)
for(int j=0; j<R; j++)
in >> cook[i][j];
Solve();
}
in.close();//打开文件以后要关闭
return 0;
}