Aizu 0525 Osenbei(状压+贪心)

题意:翻煎饼,只能横着翻或者竖着翻。问最多有多少朝上?

行只有10,所以枚举一下2^10的状态,每列取0或1中最大的一个。

在枚举外面把饼翻好,枚举里面指针指一下就好。(位运算或bitset乱搞

#include<bits/stdc++.h>
using namespace std;

const int maxn = 10000;
int a[20][maxn];
int *b[10];

//#define LOCAL
int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif
    int R,C;
    while(scanf("%d%d",&R,&C), R){
        for(int i = R; i--;){
            for(int j = C; j--;){
                scanf("%d",a[i]+j);
                a[i+R][j] = a[i][j]^1;
            }
        }
        int ans = 0;
        for(int S = 1<<R; --S >= 0;){
            for(int i = 0; i < R; i++){
                b[i] = a[i + (S>>i&1?R:0)];
            }
            int cur = 0; //b[0] b[1]
            for(int j = 0; j < C; j++){
                int cnt = 0;
                for(int i = 0; i < R; i++){
                    if(b[i][j]) cnt++;
                }
                cur += max(cnt,R-cnt);
            }
            ans = max(cur,ans);
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2015-10-18 15:48  陈瑞宇  阅读(394)  评论(0编辑  收藏  举报