452
Cerința
O plajă poate fi văzută ca o matrice cu n linii și m coloane. Elementele matricii sunt codificate cu 0, însemnând o poziție liberă, și 1, însemnând o poziție ocupată. Să se afle aria celui mai mare dreptunghi liber din matricea dată.
Date de intrare
Fișierul de intrare plaja.in conține pe prima linie numerele n și m, iar pe următoarele n linii câte m caractere reprezentând plaja.
Date de ieșire
Fișierul de ieșire plaja.out va conține pe prima linie numărul S, reprezentând aria maximă a unui dreptunghi liber.
Restricții și precizări
1 ≤ n, m ≤ 1000
Exemplu
plaja.in
5 5 11111 11000 11100 11100 11110
plaja.out
6
Explicație
1 1 1 1 1
1 1 0 0 0
1 1 1 0 0
1 1 1 0 0
1 1 1 1 0
Suprafata dreptunghiulara de aria maxima este cea ingrosata.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("plaja.in");
ofstream cout("plaja.out");
int n , m , x , maxx , v1[10001];
char v[10001];
int get(int vec[], int k)
{
stack<int> s;
int maxa = 0, toop , a , i = 0;
while(i < k)
{
if(s.empty() || vec[s.top()] <= vec[i])s.push(i++);
else
{
toop = s.top();
s.pop();
a = vec[toop] * (s.empty() ? i : i - s.top() - 1);
maxa = max(maxa , a);
}
}
while(!s.empty())
{
toop = s.top();
s.pop();
a = vec[toop] * (s.empty() ? i : i - s.top() - 1);
maxa = max(maxa , a);
}
return maxa;
}
int main()
{
cin >> n >> m;
for(int i = 0; i <= n; ++i)
{
cin.getline(v , 10001);
for(int j = 0; j < (int)strlen(v); ++j)
{
if((v[j] - '0') == 1) v1[j] = 0;
else if((v[j] - '0') == 0) v1[j] += 1;
}
x = get(v1 , m);
maxx = max(maxx , x);
}
cout << maxx;
return 0;
}
Comentarii