在C ++中翻转二进制矩阵最多K次后的最大分数

在本教程中,我们将讨论一个程序,该程序在将Binary Matrix最多翻转K次后才能找到最大分数。

为此,我们将提供包含零和一的2D矩阵。我们的任务是将特定行或列中的值翻转最多K次。将二进制值转换为十进制,将它们加起来并找到最大和。

示例

#include <bits/stdc++.h>
using namespace std;
const int n = 3;
const int m = 4;
//从矩阵中找到最大和
int maxMatrixScore(int A[n][m], int K) {
   map<int, int> update;
   for (int i = 0; i < n; ++i) {
      if (A[i][0] == 0) {
         int ans = 0;
         for (int j = 1; j < m; ++j)
            ans = ans + A[i][j] * pow(2, m - j - 1);
            update[ans] = i;
         }
      }
      map<int, int>::iterator it = update.begin();
      while (K > 0 && it != update.end()) {
         int idx = it->second;
         for (int j = 0; j < m; ++j)
            A[idx][j] = (A[idx][j] + 1) % 2;
         it++;
         K--;
      }
      int ans = 0;
      for (int j = 0; j < m; ++j) {
         int zero = 0, one = 0;
         for (int i = 0; i < n; ++i) {
            A[i][j] == 0 ? zero++ : one++;
      }
      if (K > 0 && zero > one) {
         ans += zero * pow(2, m - j - 1);
         K--;
      }
      else
         ans += one * pow(2, m - j - 1);
   }
   return ans;
}
int main() {
   int A[n][m] = { { 0, 0, 1, 1 },{ 1, 0, 1, 0 },{ 1, 1, 0, 0 } };
   int K = 2;
   cout << maxMatrixScore(A, K);
   return 0;
}

输出结果

36