Pagini recente » Cod sursa (job #3313461) | Cod sursa (job #741699) | Cod sursa (job #3356451) | Cod sursa (job #2824042) | Cod sursa (job #3317686)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("bmatrix.in");
ofstream fout("bmatrix.out");
int n, m;
int h[205], stiva[205];
int sus[205], jos[205], st[205], soldr[205];
char s[205];
bool a[202][202];
int ariemax(int dim)
{
int vf = 0, sol = 0;
stiva[++vf] = 0;
for (int i = 1; i <= dim + 1; i++)
{
while (vf != 0 && h[stiva[vf]] > h[i])
{
sol = max(sol, h[stiva[vf]] * (i - 1 - (stiva[vf - 1] + 1) + 1));
--vf;
}
stiva[++vf] = i;
}
return sol;
}
int main() {
fin >> n >> m;
fin.get();
for (int i = 1; i <= n; i++)
{
fin.getline(s, m + 2);
for (int j = 1; j <= m; j++)
a[i][j] = s[j - 1] - '0';
}
int sol = 0;
//sus in jos
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
if (a[i][j] == 0)
h[j]++;
else
h[j] = 0;
sus[i] = max(sus[i - 1], ariemax(m));
}
//jos in sus
for (int j = 1; j <= m; j++)
h[j] = !(a[n][j]);
jos[n] = ariemax(m);
for (int i = n - 1; i > 0; i--)
{
for (int j = 1; j <= m; j++)
if (a[i][j] == 0)
h[j]++;
else
h[j] = 0;
jos[i] = max(jos[i + 1], ariemax(m));
}
//st spre dr
for (int i = 1; i <= n; i++)
h[i] = !(a[i][1]);
st[1] = ariemax(n);
for (int j = 2; j <= m; j++)
{
for (int i = 1; i <= n; i++)
if (a[i][j] == 0)
h[i]++;
else
h[i] = 0;
st[j] = max(st[j - 1], ariemax(n));
}
//dr spre st
for (int i = 1; i <= n; i++)
h[i] = !(a[i][m]);
soldr[m] = ariemax(n);
for (int j = m - 1; j > 0; j--)
{
for (int i = 1; i <= n; i++)
if (a[i][j] == 0)
h[i]++;
else
h[i] = 0;
soldr[j] = max(soldr[j + 1], ariemax(n));
}
for (int i = 1; i < n; i++)
sol = max(sol, sus[i] + jos[i + 1]);
for (int j = 1; j < m; j++)
sol = max(sol, st[j] + soldr[j + 1]);
fout << sol << '\n';
return 0;
}