题目链接: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