LeetCode #861. Score After Flipping Matrix

本文探讨了如何通过切换矩阵的行和列来最大化矩阵的分数,解释了一种高效的算法实现,该算法能够确保每行的最高位为1,并通过统计各列中1的数量来进一步优化矩阵的总分数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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. 1 <= A.length <= 20
  2. 1 <= A[0].length <= 20
  3. A[i][j] is 0 or 1.
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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值