Problem of The Day: Score After Flipping Matrix
Problem Statement

Intuition
The problem seems to revolve around maximizing the score of a binary matrix by toggling rows and columns.
Approach
My initial thought is to approach this problem iteratively. First, I’ll focus on making all the first elements of each row to be 1, since that would give the maximum possible value for that bit. Then, I’ll iterate through each column and toggle it if the number of 0s is greater than the number of 1s.
Complexity
- 
    Time complexity: O(m * n) 
- 
    Space complexity: O(1) 
Code
class Solution:
    def matrixScore(self, grid: List[List[int]]) -> int:
        rows = len(grid)
        cols = len(grid[0])
        def toggle_value_row(row):
            for col in range(cols):
                grid[row][col] = 0 if grid[row][col] == 1 else 1
        def toggle_value_col(col):
            for row in range(rows):
                grid[row][col] = 0 if grid[row][col] == 1 else 1
        for row in range(rows):
            for col in range(cols):
                if grid[row][col] == 1:
                    break
                if grid[row][col] == 0:
                    toggle_value_row(row)
                    break
        for col in range(cols):
            counter = Counter()
            for row in range(rows):
                counter[grid[row][col]] += 1
            if counter[0] > counter[1]:
                toggle_value_col(col)
        res = 0
        for row in range(rows):
            i = 0
            for col in reversed(range(cols)):
                if grid[row][col] == 1:
                    res += (2 ** i)
                i += 1
        return res
Editorial Solution
Approach 1: Greedy Way (Modifying Input)
class Solution:
    def matrixScore(self, grid: List[List[int]]) -> int:
        m = len(grid)
        n = len(grid[0])
        # Set first column
        for i in range(m):
            if grid[i][0] == 0:
                # Flip row
                for j in range(n):
                    grid[i][j] = 1 - grid[i][j]  # Bitwise XOR for flip
        # Optimize columns except first column
        for j in range(1, n):
            count_zero = 0
            # Count zeros
            for i in range(m):
                if grid[i][j] == 0:
                    count_zero += 1
            # Flip the column if more zeros for better score
            if count_zero > m - count_zero:
                for i in range(m):
                    grid[i][j] ^= 1  # Bitwise XOR for flip
        # Calculate the final score considering bit positions
        score = 0
        for i in range(m):
            for j in range(n):
                # Left shift bit by place value of column to find column contribution
                columnScore = grid[i][j] << (n - j - 1)
                # Add contribution to score
                score += columnScore
        # Return final result
        return score
Approach 2: Greedy Way (Without Modifying Input)
class Solution:
    def matrixScore(self, grid: List[List[int]]) -> int:
        m = len(grid)
        n = len(grid[0])
        # Set score to summation of first column
        score = (1 << (n - 1)) * m
        # Loop over all other columns
        for j in range(1, n):
            count_same_bits = 0
            for i in range(m):
                # Count elements matching first in row
                if grid[i][j] == grid[i][0]:
                    count_same_bits += 1
            # Calculate score based on the number of same bits in a column
            count_same_bits = max(count_same_bits, m - count_same_bits)
            # Calculate the score contribution for the current column
            column_score = (1 << (n - j - 1)) * count_same_bits
            # Add contribution to score
            score += column_score
        return score