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