fbpx

Problema #1267 – plaja – Rezolvari PBInfo

de Mihai-Alexandru

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

S-ar putea sa iti placa