Hướng giải của Hình chữ nhật lớn nhất trong ma trận nhị phân
Nhớ rằng hướng dẫn giải này chỉ nên sử dụng khi bế tắc, và tuyệt đối không nên sao chép mã nguồn kèm theo. Hãy tôn trọng tác giả bài tập và người viết hướng dẫn giải.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.
Tác giả:
lời giải: Hình chữ nhất lớn nhất trong ma tran nhi phan
Phan tich
bài toán được giai bang cach ap dung thuat toan Largest Rectangle in Histogram cho tung hang cua ma tran.
Duyet tung hang tu tren xuong duoi:
- Voi moi hang, cap nhất chieu cao cua cac cot: neu o hien tai la 1 thi tang chieu cao len 1, nguoc lai dat ve 0.
- Ap dung thuat toan Largest Rectangle in Histogram de tìm hình chữ nhất toan 1 lớn nhất tai hang nay.
Do phuc tap: \(O(N \times M)\).
Ma nguon C++
#include <bits/stdc++.h>
using namespace std;
long long largestRectangle(vector<int>& h) {
stack<int> st;
long long ans = 0;
h.push_back(0);
for (int i = 0; i < (int)h.size(); i++) {
while (!st.empty() && h[st.top()] > h[i]) {
long long height = h[st.top()]; st.pop();
int left = st.empty() ? -1 : st.top();
long long width = i - left - 1;
ans = max(ans, height * width);
}
st.push(i);
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<vector<int>> a(n, vector<int>(m));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> a[i][j];
vector<int> h(m, 0);
long long ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] == 1) h[j]++;
else h[j] = 0;
}
ans = max(ans, largestRectangle(h));
}
cout << ans << "\n";
return 0;
}
Nhận xét