Cho ma trận nhị phân. Cần tìm số lượng bit 1 tối đa có thể đạt được nếu lật một hàng và một cột (lật nghĩa là đổi 0↔1).
Ví dụ ma trận 3x3:
1 0 1
0 1 0
1 0 0
Kết quả: 8.
Giải thuật:
- Tính tổng số 1 của mỗi hàng (
row[i]), mỗi cột (col[j]) và tổng cả ma trận (total). - Với mỗi ô
(i,j), tính số 1 sau khi lật hàngivà cộtj:cand = total - row[i] - col[j] + (m - row[i]) + (n - col[j])Nếumatrix[i][j] == 1thìcand += 2, ngược lạicand -= 2. - Lấy
maxcủa tất cảcand.
Ví dụ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(vector<vector<int>>& matrix) {
int n = matrix.size(), m = matrix[0].size();
int ret = 0;
vector<int> row(n), col(m);
int total = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
row[i] += matrix[i][j];
col[j] += matrix[i][j];
total += matrix[i][j];
}
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
int cand = total - row[i] - col[j] + (m - row[i]) + (n - col[j]);
if (matrix[i][j]) cand += 2;
else cand -= 2;
ret = max(ret, cand);
}
return ret;
}
};
int main() {
Solution ob;
vector<vector<int>> v = {{1,0,1},{0,1,0},{1,0,0}};
cout << (ob.solve(v));
}
Đầu vào
{{1,0,1},{0,1,0},{1,0,0}}
Đầu ra
8