สมมติว่าเรามีเมทริกซ์ไบนารี 2 มิติ เราสามารถพลิกบิตทั้งแถวหรือคอลัมน์ได้ทุกจำนวนครั้ง หากนำแต่ละแถวมาแปลงเป็นเลขฐานสอง เราต้องหาผลรวมสูงสุดที่ทำได้
ตัวอย่าง: อินพุตคือ
| 0 | 1 | 0 |
| 0 | 0 | 1 |
ผลลัพธ์คือ 11 เพราะหากพลิกทั้งสองแถว จะได้ 101 (5) และ 110 (6) ผลรวม = 11
ขั้นตอนการแก้ปัญหา
- วนลูปแต่ละแถว
rในเมทริกซ์:- หาก
r[0] == 0ให้พลิกบิตทั้งแถว (r[i] = -r[i] + 1)
- หาก
- วนลูปคอลัมน์
jตั้งแต่ 1 ถึงคอลัมน์สุดท้าย:- นับ
cnt= จำนวน 1 ลบ จำนวน 0 ในคอลัมน์นั้น - หาก
cnt < 0ให้พลิกบิตทั้งคอลัมน์นั้น
- นับ
- คำนวณผลรวม: แปลงแต่ละแถวเป็นเลขฐานสิบและบวกกัน
ตัวอย่างโค้ด
class Solution:
def solve(self, matrix):
for r in matrix:
if r[0] == 0:
for i in range(len(r)):
r[i] = -r[i] + 1
for j in range(1, len(matrix[0])):
cnt = 0
for i in range(len(matrix)):
cnt += 1 if matrix[i][j] else -1
if cnt < 0:
for i in range(len(matrix)):
matrix[i][j] = -matrix[i][j] + 1
ans = 0
for r in matrix:
a = 0
for v in r:
a = 2 * a + v
ans += a
return ans
ob = Solution()
matrix = [[0, 1, 0], [0, 0, 1]]
print(ob.solve(matrix)) # Output: 11
อินพุต
[[0, 1, 0], [0, 0, 1]]
เอาต์พุต
11