คำอธิบายปัญหา
เมทริกซ์ A ค่า 0/1 สามารถพลิกแถวหรือคอลัมน์ได้ (0↔1) หลังจากพลิกแล้ว แต่ละแถวอ่านเป็น binary number คะแนน = ผลรวม ต้องการคะแนนสูงสุด
ตัวอย่าง: [[0,0,1,1],[1,0,1,0],[1,1,0,0]] → 39
วิธีแก้ปัญหา (Greedy)
- คอลัมน์แรก: พลิกแถวที่มี 0 ให้กลายเป็น 1 (คอลัมน์แรกมีน้ำหนักสูงสุด 2^(m-1))
- สำหรับคอลัมน์ j > 0: นับจำนวน 1 หลังจากพิจารณาการพลิกแถวแล้ว
- เลือกพลิกคอลัมน์หรือไม่ เพื่อให้ 1 มากที่สุด: max(cnt, n-cnt) * 2^(m-j-1)
ตัวอย่างโค้ด C++
#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();
// คอลัมน์แรก: ทำให้เป็น 1 ทั้งหมดโดยพลิกแถว
int score = n * (1 << (m - 1));
for(int j = 1; j < m; j++) {
int cnt = 0;
for(int i = 0; i < n; i++) {
// ค่าจริงหลังพลิกแถวตามคอลัมน์แรก
int val = A[i][j] == A[i][0] ? 1 : 0;
cnt += val;
}
int maxOnes = max(cnt, n - cnt);
score += maxOnes * (1 << (m - j - 1));
}
return score;
}
};
int main() {
vector<vector<int>> v = {{0,0,1,1},{1,0,1,0},{1,1,0,0}};
Solution ob;
cout << ob.matrixScore(v);
return 0;
}
อินพุต
[[0,0,1,1],[1,0,1,0],[1,1,0,0]]
เอาต์พุต
39