Cod sursa(job #2379867)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 14 martie 2019 10:47:47
Problema BMatrix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("bmatrix.in");
ofstream g("bmatrix.out");
int n, m;
char a[202][202];
int sp[202][202];
int UmxL[202], DmxL[202], UmxC[202], DmxC[202];
int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; ++i)
        f >> (a[i] + 1);
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            sp[i][j] = sp[i-1][j] + sp[i][j-1] - sp[i-1][j-1] + (a[i][j] == '0');
    for(int i = 1; i <= n; ++i)
        for(int j = i; j <= n; ++j)
        {
            int st = 1;
            for(int k = 1; k <= m; ++k)
            {
                if(sp[j][k] - sp[j][st - 1] - sp[i - 1][k] + sp[i - 1][st - 1] == (j - i + 1) * (k - st + 1))
                    UmxL[j] = max(UmxL[j], (j - i + 1) * (k - st + 1)), DmxL[i] = max(DmxL[i], (j - i + 1) * (k - st + 1));
                else
                    st = k + 1;
            }
        }
    for(int i = 2; i <= n; ++i)
        UmxL[i] = max(UmxL[i], UmxL[i-1]);
    for(int i = n - 1; i >= 1; --i)
        DmxL[i] = max(DmxL[i], DmxL[i+1]);
    for(int i = 1; i <= m; ++i)
        for(int j = i; j <= m; ++j)
        {
            int st = 1;
            for(int k = 1; k <= n; ++k)
            {
                if(sp[k][j] - sp[st - 1][j] - sp[k][i - 1] + sp[st - 1][i - 1] == (j - i + 1) * (k - st + 1))
                    UmxC[j] = max(UmxC[j], (j - i + 1) * (k - st + 1)), DmxC[i] = max(DmxC[i], (j - i + 1) * (k - st + 1));
                else
                    st = k + 1;
            }
        }
    for(int i = 2; i <= m; ++i)
        UmxC[i] = max(UmxC[i], UmxC[i-1]);
    for(int i = m - 1; i >= 1; --i)
        DmxC[i] = max(DmxC[i], DmxC[i+1]);
    int ans = 0;
    for(int i = 0; i <= m; ++i)
        ans = max(ans, UmxL[i] + DmxL[i+1]);
    for(int i = 0; i <= n; ++i)
        ans = max(ans, UmxC[i] + DmxC[i+1]);
    g << ans << '\n';
    return 0;
}