Cho một ma trận nhị phân 2D. Đối với bất kỳ hàng hoặc cột nào trong ma trận cho trước, chúng ta có thể lật tất cả các bit (0 thành 1, 1 thành 0). Nếu có thể thực hiện bất kỳ số lượng phép toán nào, và coi mỗi hàng như một số nhị phân, hãy tìm tổng lớn nhất có thể đạt được từ các số này.
Ví dụ, nếu đầu vào là:
| 0 | 1 | 0 |
| 0 | 0 | 1 |
Thì đầu ra sẽ là 11, vì nếu lật cả hai hàng ta được 101 và 110, tổng là 5 + 6 = 11.
Để giải quyết, thực hiện các bước sau:
- Với mỗi hàng
rtrong ma trận:- Nếu
r[0] == 0, lật toàn bộ hàng:r[i] = -r[i] + 1cho mọii.
- Nếu
- Với mỗi cột
jtừ 1 đến số cột - 1:- Đếm
cnt= số lượng 1 trừ số lượng 0 trong cộtj. - Nếu
cnt < 0, lật toàn bộ cộtj.
- Đếm
- Tính tổng: với mỗi hàng, chuyển dãy bit thành số nguyên và cộng dồn.
- Trả về tổng.
Ví dụ triển khai
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))
Đầu vào
[[0, 1, 0], [0, 0, 1]]
Đầu ra
11