Giả sử chúng ta có một ma trận M với kích thước w x h, sao cho mọi ô đều có giá trị 0 hoặc 1, và bất kỳ ma trận con vuông nào của M có kích thước l x l đều có nhiều nhất là tối đa một số ô. Chúng ta phải tìm số ma trận M tối đa có thể có.
Vì vậy, nếu đầu vào là w =3, h =3, l =2, maxOnes =1, thì đầu ra sẽ là 4 như trong ma trận 3 * 3, không ma trận con 2 * 2 nào có thể có nhiều hơn 1. . Giải pháp tốt nhất có 4 giải pháp là -
| 1 | 0 | 1 |
| 0 | 0 | 0 |
| 1 | 0 | 1 |
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
ret:=0
-
tạo một mảng 2D sq có kích thước n x n
-
để khởi tạo i:=0, khi i
-
để khởi tạo j:=0, khi j
-
tăng sq [i mod n, j mod n] lên 1
-
-
-
Xác định một mảng v
-
để khởi tạo i:=0, khi i
-
để khởi tạo j:=0, khi j
-
chèn sq [i, j] vào cuối v
-
-
-
sắp xếp mảng v theo thứ tự ngược lại
-
để khởi tạo i:=0, j:=0, khi tôi
-
trả lại ret
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int maximumNumberOfOnes(int width, int height, int n, int maxOnes) {
int ret = 0;
vector < vector <int> > sq(n, vector <int>(n));
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
sq[i % n][j % n]++;
}
}
vector <int> v;
for(int i = 0; i < n; i++){
for(int j = 0; j < n ; j++){
v.push_back(sq[i][j]);
}
}
sort(v.rbegin(), v.rend());
for(int i = 0, j = 0; i < v.size() && j < maxOnes; i++, j++){
ret += v[i];
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.maximumNumberOfOnes(3,3,2,1));
} Đầu vào
3, 3, 2, 1
Đầu ra
4