在C ++中翻转矩阵后得分

假设我们有一个二维矩阵A,其中每个值均为0或1。这里的移动包括选择任何行或列,以及切换该行或列中的每个值:将所有0更改为1,并将所有1更改为0。现在,在进行任意数量的移动之后,此矩阵的每一行都被解释为二进制数,并且矩阵的得分是这些数字的总和。因此,我们的任务是找到最高分。如果输入像-

0011
1010
1100

切换后输出为39,矩阵为-

1111
1001
1111

所以数字是15 + 9 + 15 = 39

为了解决这个问题,我们将遵循以下步骤-

  • n:=行数和m:=列数

  • ret:= nx(2 ^(m – 1))

  • 对于1到m – 1范围内的j

    • cnt:= cnt + A [i,j] = A [i,0]

    • cnt = 0

    • 对于i,范围为0至n – 1

    • temp:= 2 ^(m – j – 1)*最大值cnt和n – cnt

    • ret:= ret +温度

    • 返回ret

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
       public:
       int matrixScore(vector<vector<int>>& A) {
          int n = A.size();
          int m = A[0].size();
          int ret = (1 << (m - 1)) * n;
          for(int j = 1; j < m; j++){
             int cnt = 0;
             for(int i = 0; i < n; i++){
                cnt += (A[i][j] == A[i][0]);
             }
             int temp = ((1 << (m - (j + 1))) * max(cnt, n - cnt));
             ret += temp;
          }
          return ret;
       }
    };
    main(){
       vector<vector<int>> v = {{0,0,1,1},{1,0,1,0},{1,1,0,0}};
       Solution ob;
       cout << (ob.matrixScore(v));
    }

    输入值

    [[0,0,1,1],[1,0,1,0],[1,1,0,0]]

    输出结果

    39