JOI2008予選 問題5@C++(7)

ビット演算の基本さえ知っていれば簡単。

#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

int main(int argc,char* argv[])
{
	int r,c;
	scanf("%d %d",&r,&c);
	vector<int> nums(c);
	for(int i=0;i<r;i++) {
		for(int j=0;j<c;j++) {
			int current;
			scanf("%d",&current);
			nums[j]+=current<<i;
		}
	}
	vector<int> bintocount(1<<r);
	for(int i=0;i<(1<<r);i++) {
		int count=0;
		for(int j=0;j<r;j++) {
			if(i&(1<<j))count++;
		}
		bintocount[i]=max(count,r-count);
	}
	int max_sum=0;
	for(int i=0;i<(1<<r);i++) {
		int sum=0;
		for(int j=0;j<c;j++) {
			sum+=bintocount[i^nums[j]];
		}
		max_sum=max(max_sum,sum);
	}
	printf("%d\n",max_sum);
	return 0;
}