/**
1508 · Score After Flipping Matrix
Algorithms
Medium
Accepted Rate
89%
DescriptionSolutionNotesDiscussLeaderboard
Description
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 0s to 1s, and all 1s to 0s.
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.
1 \leq A.length \leq 201≤A.length≤20
1 \leq A[0].length \leq 201≤A[0].length≤20
A[i][j] is 0 or 1.
Example
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
Example 2:
Input: [[1,1],[0,0],[1,0],[1,0],[1,1]]
Output: 13
Explanation:
Toggled to [[1,1],[1,1],[1,0],[1,0],[1,1]].
0b11 + 0b11 + 0b10 + ob10 + ob11 = 3 + 3 + 2 + 2 + 3= 13
Tags
Company
IIT Bombay
https://blog.youkuaiyun.com/m0_37889928/article/details/82946883
https://www.lintcode.com/problem/1508/
*/
/**
* @param A: a matrix
* @return: the score
*/
func matrixScore(A [][]int) int {
// Write your code here.
var row int = len(A)
if row == 0 {
return 0
}
var col int = len(A[0])
var res int = row * (1 << uint32(col-1))
for i := 0; i < row; i++ {
if A[i][0] == 1 {
continue
}
for j := 0; j < col; j++ {
A[i][j] = (A[i][j] + 1) % 2
}
}
for j := 1; j < col; j++ {
var ct int = 0
for i := 0; i < row; i++ {
ct += A[i][j]
}
ct = Max(ct, row - ct)
res += ct * (1 << uint32(col - j - 1))
}
return res
}
func Max(a, b int) int {
if a > b {
return a
}
return b
}