题意:
一个地图,只有0,1,每次可以转换一行或者一列,使得一行或者一列的0和1值互换,求最多可以有多少个1
题解:
先对行爆搜,以为题中行数少,然后对每一列记录1的个数和0的个数,取较大值,其中使用了bitset简单的实现了转换
bitset <10000> a[10];
对于行的爆搜,使用了二进制转换从0到pow(2,r)-1,每个数的二进制数对应是否转换这一行
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#define pr(x) cout<<#x<<" "<<x;
#define pl(x) cout<<#x<<" "<<x<<endl;
#include<math.h>
#include<algorithm>
#include<set>
#include<map>
#include<unordered_set>
#include<bitset>
using namespace std;
bitset <10000> a[10];
int str[10];
void change(int x){
memset(str,0,sizeof(str));
for(int i = 0;x>0;i++){
str[i] = x%2;//pl(str[i]);
x = x/2;
}
}
int main(){
int r,c;
while(cin>>r>>c&&r!=0){
int ans =0;
for(int i = 0;i<r;i++){
for(int j = 0;j<c;j++){
bool b;
cin>>b;
a[i][j] = b;
}
}
for(int i = 0;i<pow(2,r);i++){
int anss=0;
change(i);
for(int j = 0;j<r;j++){
if(str[j]==1){a[j].flip();}
}
for(int k = 0;k<c;k++){
int ccount =0;
for(int i =0;i<r;i++){
if(a[i][k]==1){ccount++;}
}
//pl(ccount);
anss +=max(ccount,r-ccount);
}
ans = max(ans,anss);
for(int j = 0;j<r;j++){
if(str[j]==1){a[j].flip();}
}
}
cout<<ans<<endl;
}
}