Mô tả bài toán
Cho ma trận nhị phân m x n. Có thể sắp xếp lại thứ tự cột tùy ý. Tìm diện tích ma trận con toàn số 1 lớn nhất sau khi sắp xếp cột.
Ví dụ
Ma trận:
0 0 1 1 1 1 1 0 1Sau sắp xếp cột -> ma trận con 2x2 toàn 1, diện tích =
4.
Giải thuật
- Tính chiều cao cột liên tiếp 1:
matrix[i][j] += matrix[i-1][j]nếumatrix[i][j] == 1. - Với mỗi hàng, sắp xếp các chiều cao giảm dần.
- Duyệt từ phải sang trái: diện tích =
(col - j) * matrix[i][j], cập nhật max.
Triển khai Python
def solve(matrix):
row, col = len(matrix), len(matrix[0])
for j in range(col):
for i in range(1, row):
if matrix[i][j]:
matrix[i][j] += matrix[i - 1][j]
ans = 0
for i in range(row):
matrix[i].sort()
for j in range(col - 1, -1, -1):
if matrix[i][j] == 0:
break
ans = max(ans, (col - j) * matrix[i][j])
return ans
matrix = [[0, 0, 1], [1, 1, 1], [1, 0, 1]]
print(solve(matrix))
Đầu vào
[[0,0,1],[1,1,1],[1,0,1]]
Đầu ra
4