链接:aoj0525
题意:药药!切克闹! 煎饼果子来一套!有一个烤饼器可以烤r行c列的煎饼,煎饼可以正面朝上(用1表示)也可以背面朝上(用0表示)。一次可将同一行或同一列的煎饼全部翻转。现在需要把尽可能多的煎饼翻成正面朝上,问最多能使多少煎饼正面朝上?
输入:多组输入,每组第一行为二整数r, c (1 ≤ r ≤ 10, 1 ≤ c ≤ 10 000),剩下r行c列表示煎饼初始状态。r=c=0表示输入结束。
输出:对于每组输入,输出最多能使多少煎饼正面朝上。
中文参考http://bbs.byr.cn/#!article/ACM_ICPC/73337?au=Milrivel
第一想法其实就是枚举….没有其他什么,不过感觉不是很好处理…..直接暴力大概会超时吧也没去试,
看到大牛博客的关于bitset的使用,才知道还有个这么神奇的东西,顺便转个文章做个总结~
因为r最大只有10,只需要预先建立10个bitset即可,处理起来很方便.
/*
* Filename:    aoj0525.cpp
* Desciption:  Desciption
* Created:     2016-03-10
* Author:      JIngwei Xu [mail:xu_jingwei@outlook.com]
*
*/
#include<bitset>
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#define INT_MAX 1<<30
using namespace std;
typedef long long ll;
const int INF=0x7F;
int n,m,ans;
bitset<10000> bits[10];
int check(){
    int ct=0,rec=0;
    for (int i = 0; i < m; i += 1)
    {
        ct=0;
        for (int j = 0; j < n; j += 1)
        {
            if(bits[j][i]==1)ct++;
        }
        ct=max(ct,n-ct);
        rec+=ct;
    }
    return rec;
}
void dfs(int k){
    if (k==n)
    {
        ans=max(ans,check());
        return;
    }
    for (int i = 0; i < 2; i += 1)
    {
        bits[k].flip();
        dfs(k+1);
    }
}
int main()
{
//ios_base::sync_with_stdio(0);
#ifdef JIngwei_Xu
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
#endif
    while (scanf("%d%d",&n,&m)&&n&&m)
    {
        int t;
        ans=0;
        for (int i = 0; i < n; i += 1)
        {
            for (int j = 0; j < m; j += 1)
            {
                scanf("%d",&t);
                bits[i][j]=t;
            }
        }
        dfs(0);
        printf("%d\n",ans);
    }
    return 0;
} 
                        
                        