20.12.7 leetcode861

题目链接:https://leetcode-cn.com/problems/score-after-flipping-matrix/

题意:给一个二维的01矩阵,可以任意翻转某一行和某一列(将该行/列的01互换),最后计数时以将每一行当做一个二进制数,每行相加就是总的分数,求最大分数为多少。

分析:首先,对行列的翻转顺序不会改变最后的值(以一个点来看,不管它被以怎么样的顺序翻转,他翻转的次数是固定的),我们可以先考虑行翻转,这里为了使二进制数最大,一定是要让第一列的数都为1,之后我们每一列来分别计算贡献,可以根据每一行第一列原本是否为1来判断当前的数有否经过翻转(可以通过同或判断),然后以01谁数目多来判断该列是否需要翻转。

class Solution {
public:
    int matrixScore(vector<vector<int>>& A) {
        int r=A.size(),c=A[0].size();
        int ans=0;
        ans+=r*(1<<(c-1));
        for(int i=1;i<c;i++){
            int zero=0,one=0;
            for(int j=0;j<r;j++){
                if(!(A[j][i]^A[j][0]))one++;
                else zero++;
            }
            int t=max(zero,one);
            ans+=t*(1<<(c-i-1));
        }
        return ans;
    }
};
原文地址:https://www.cnblogs.com/qingjiuling/p/14095806.html