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.
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] is 0 or 1.
class Solution:
    def matrixScore(self, A: List[List[int]]) -> int:
      maxsum = 0
      power = len(A[0])
      for row in A:
        for i in range(power):
          maxsum += 2**(power - 1 - i)*row[i]
      while True:
        change = False
        crow = False
        num = 0
        cursum = maxsum
        localsum = maxsum
        for row in range(len(A)):
          for i in range(power):
            term = 2**(power-1-i)
            if A[row][i] == 1:
              cursum -= term
            else:
              cursum += term
          if cursum > maxsum:
            change = True
            maxsum = cursum
            crow = True
            num = row
          cursum = localsum
        for col in range(power):
          term = 2**(power - 1- col)
          for row in range(len(A)):
            if A[row][col] == 1:
              cursum -= term
            else:
              cursum += term
          if cursum > maxsum:
            change = True
            maxsum = cursum
            crow = False
            num = col
          cursum = localsum
        if change:
          if crow:
            for i in range(power):
              A[num][i] = A[num][i] + (1 - 2*A[num][i])
          else:  
            for row in range(len(A)):
              A[row][num] = A[row][num] + (1-2*A[row][num])
        if not change:
          return maxsum

class Solution:
    def matrixScore(self, A: List[List[int]]) -> int:
      maxsum = 0
      power = len(A[0])
      for row in A:
        for i in range(power):
          maxsum += 2**(power - 1 - i)*row[i]
      while True:
        change = False
        crow = False
        num = 0
        cursum = maxsum
        localsum = maxsum
        for row in range(len(A)):
          for i in range(power):
            term = 2**(power-1-i)
            if A[row][i] == 1:
              cursum -= term
            else:
              cursum += term
          if cursum > maxsum:
            change = True
            maxsum = cursum
            crow = True
            num = row
          cursum = localsum
        for col in range(power):
          term = 2**(power - 1- col)
          for row in range(len(A)):
            if A[row][col] == 1:
              cursum -= term
            else:
              cursum += term
          if cursum > maxsum:
            change = True
            maxsum = cursum
            crow = False
            num = col
          cursum = localsum
        if change:
          if crow:
            for i in range(power):
              A[num][i] = A[num][i] + (1 - 2*A[num][i])
          else:  
            for row in range(len(A)):
              A[row][num] = A[row][num] + (1-2*A[row][num])
        if not change:
          return maxsum
