题目描述:
We have a two dimensional matrix A
where each value is 0
or 1
.
A move consists of choosing any row or column, and toggling each value in that row or column: changing all 0
s to 1
s, and all 1
s to 0
s.
After making any number of moves, every row of this matrix is interpreted as a binary number, and the score of the matrix is the sum of these numbers.
Return the highest possible score.
Example 1:
Input: [[0,0,1,1],[1,0,1,0],[1,1,0,0]] Output: 39 Explanation: Toggled to [[1,1,1,1],[1,0,0,1],[1,1,1,1]]. 0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39
Note:
1 <= A.length <= 20
1 <= A[0].length <= 20
A[i][j]
is0
or1
.
class Solution {
public:
int matrixScore(vector<vector<int>>& A) {
int m=A.size(), n=A[0].size();
// 每一行的最高位一定要设置成1
int result=m*(1<<(n-1));
for(int j=1;j<n;j++)
{
int count=0;
// 翻转完每一行之后,再翻转每一列,将当前元素和最高位比较
// 如果相同的话,说明这一行翻转后当前元素也是1,否则是0
// 统计当前列一共有多少个1和0,那么选个数较大的一组设定为1
for(int i=0;i<m;i++)
if(A[i][j]==A[i][0]) count++;
result+=max(count,m-count)*(1<<(n-j-1));
}
return result;
}
};