1. 程式人生 > 實用技巧 >861. 翻轉矩陣後的得分

861. 翻轉矩陣後的得分

有一個二維矩陣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]]
0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39

提示:

1 <= A.length <= 20
1 <= A[0].length <= 20
A[i][j]是0 或1

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/score-after-flipping-matrix
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 class Solution {
 4 public:
 5     //貪心思想 
 6     //若每行的第一個數都是1 才會得分最高
 7     //所以先貪心每行的第一位數 都讓它為1
 8     //此時就不能改變行了 因為改變行會導致第一位不為1
 9     //
接著從第二列開始貪心列 使得每一列的1的個數最多 10 void inverseRow(vector<vector<int>>& A, int row)//翻轉行 11 { 12 int col_size = A[0].size(); 13 for (int j = 0; j < col_size; j++) 14 A[row][j] = A[row][j] ^ 1; 15 } 16 void inverseCol(vector<vector<int>>& A, int
col)//翻轉列 17 { 18 int row_size = A.size(); 19 for (int i = 0; i < row_size; i++) 20 A[i][col] = A[i][col] ^ 1; 21 } 22 int computeRes(vector<vector<int>>& A)//計算結果 23 { 24 int res = 0; 25 int row = A.size(), col = A[0].size(); 26 int temp = 0; 27 for (int i = 0; i < row; i++)//計算每一行 28 { 29 temp = 0;//每一行的二進位制值 30 for (int j = 0; j < col; j++) 31 temp = temp * 2 + A[i][j]; 32 res += temp; 33 } 34 return res; 35 } 36 int matrixScore(vector<vector<int>>& A) { 37 int row = A.size(), col = A[0].size(); 38 for (int i = 0; i < row; i++)if (!A[i][0])inverseRow(A, i);//對第一列進行貪心 翻轉每行 使得第一列為全1 39 int count_1; 40 for (int j = 1; j < col; j++)//對之後的每一列進行貪心 翻轉列 41 { 42 count_1 = 0;//記錄當前列為1的個數 43 for (int i = 0; i < row; i++)if (A[i][j])count_1++; 44 if (count_1 <= row / 2)inverseCol(A, j);//若為1的個數小於行數的一半 則需要列翻轉 45 } 46 return computeRes(A); 47 } 48 }; 49 int main() 50 { 51 int m, n, temp, data; 52 cin >> m >> n; 53 vector<vector<int>> A; 54 while (m--) 55 { 56 temp = n; 57 vector<int> v; 58 while (temp--) 59 { 60 cin >> data; 61 v.push_back(data); 62 } 63 A.push_back(v); 64 } 65 cout << Solution().matrixScore(A); 66 return 0; 67 }