สมมติว่าเรามีเมทริกซ์ M ขนาด w x h โดยที่ทุกเซลล์มีค่า 0 หรือ 1 และ sub-matrix สี่เหลี่ยมจัตุรัสขนาด l x l ใดๆ ของ M มีจำนวน 1 สูงสุด maxOnes เราต้องหาจำนวน 1 สูงสุดที่เมทริกซ์ M อาจมีได้
ดังนั้น หากอินพุทคือ w = 3, h = 3, l = 2, maxOnes = 1 ผลลัพธ์จะเป็น 4 เนื่องจากในเมทริกซ์ 3x3 ไม่มี sub-matrix 2x2 ไหนที่มี 1 มากกว่า 1 ตัว วิธีที่ดีที่สุดที่มี 4 ตัว 1 คือ:
| 1 | 0 | 1 |
| 0 | 0 | 0 |
| 1 | 0 | 1 |
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:
ret := 0
สร้างอาเรย์ 2 มิติ sq ขนาด n x n
for i := 0 ถึง height-1, for j := 0 ถึง width-1: เพิ่ม sq[i mod n][j mod n] ขึ้น 1
กำหนดอาเรย์ v
for i := 0 ถึง n-1, for j := 0 ถึง n-1: ใส่ sq[i][j] ลง v
จัดเรียง v เรียงจากมากไปน้อย
for i := 0, j := 0; i < ขนาดของ v และ j < maxOnes; i++, j++: ret += v[i]
คืนค่า ret
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int maximumNumberOfOnes(int width, int height, int n, int maxOnes) {
int ret = 0;
vector> sq(n, vector(n));
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
sq[i % n][j % n]++;
}
}
vector 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;
}
};
int main() {
Solution ob;
cout << (ob.maximumNumberOfOnes(3, 3, 2, 1));
return 0;
}
อินพุต
3, 3, 2, 1
เอาต์พุต
4