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 <fstream>
using namespace std;
ifstream cin("plaja.in");
ofstream cout("plaja.out");
int n, m, v[1010][1010], s[1010][1010], i, j, i2, j2, sum, S;
char c;
int main()
{
cin >> n >> m;
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
cin >> c;
if (c == '0')
v[i][j] = 0;
else if (c == '1')
v[i][j] = 1;
s[i][j] = s[i-1][j] + v[i][j];
}
}
for (i = 1; i <= n; i++) {
for (i2 = i; i2 <= n; i2++) {
j = 1;
for (j2 = 1; j2 <= m; j2++) {
sum = s[i2][j2] - s[i-1][j2];
if (sum)
j = j2 + 1;
else
S = max(S, (i2 - i + 1) * (j2 - j + 1));
}
}
}
cout << S;
return 0;
}