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.
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.
Ispisati jedan broj, koji predstavlja dužinu stranice najvećeg traženog kvadrata.
3 0 1 0 1 0 0 0 0 1
2
4 0 0 0 1 0 1 0 1 0 0 0 0 1 1 1 1
2
У овом блоку се описује главно решење задатка.
#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;
}