Čokolada

Na omotu čokolade sa lešnikom piše da proizvođač garantuje da se u kvadratu od \(a * a\) kockica sigurno nalazi bar jedan lešnik. Nikola je kupio jednu čokoladu i zanima ga koji je najveći kvadrat koji može pronaći tako da se u donjem desnom uglu kvadrata nalazi lešnik. Napisati program koji nalazi najveći kvadrat sačinjen od \(x * x\) kockica tako da sadrži samo jedan lešnik, i taj lešnik se nalazi u poslednjoj kockici tog kvadrata. Vremenska složenost treba biti \(O(n^2)\), a prostorna složenost \(O(n^2)\). Pojašnjenje: traženi kvadrat dimenzije 2 je oblika:

0 0 0 1

gde nula predstavlja kockicu u kojoj nema lešnika, dok 1 predstavlja kockicu u kojoj se nalazi lešnik, ostali kvadrati nisu oni koje Nikola traži.

Opis ulaza

Sa standardnog ulaza se učitava ceo broj \(n\) (\(1 < n < 10^6\)), a zatim i \(n^2\) brojeva (\(0\) ili \(1\)) koji predstavljaju da li određena kockica čokolade sadrži lešnik ili ne.

Opis izlaza

Ispisati jedan broj, koji predstavlja dužinu stranice najvećeg traženog kvadrata.

Primer 1

Ulaz

3 0 1 0 1 0 0 0 0 1

Izlaz

2

Primer 2

Ulaz

4 0 0 0 1 0 1 0 1 0 0 0 0 1 1 1 1

Izlaz

2

Rešenje

Опис главног решења

У овом блоку се описује главно решење задатка.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;



int main(){
    int n;
    cin >> n;


    int x;
    vector<int> niz1(n);
    vector<int> niz2(n);
    for(int i = 0; i < n; i++){
        cin >> x;
        niz1[i] = x == 1 ? 0 : 1;
    }


    /*
     x x x x x x
     x 0
     x
     x
     -> 0

     x x x x x x
     x 1
     x
     x
     -> min(tri u pomocnom)+1
     */
    int maks = 1;
    for(int i = 1; i < n; i++){
        for(int j = 0; j < n; j++){
            if( j == 0 ){
                cin >> x;
                niz2[j] = 1 - x;
            }
            else{
                cin >> x;
                if(x == 0){
                    x = 0;
                    niz2[j]=min({niz1[j],niz2[j-1],niz1[j-1]})+1;
                }else{
                    x = min({niz1[j],niz2[j-1],niz1[j-1]})+1;
                    niz2[j]=0;
                }
            }
            if(maks < x){
                maks = x;
            }

        }
        niz1=niz2;
    }
    // ispisi(dp,n);
    cout << maks << endl;
    return 0;
}