Informatyczny kącik olimpijski
Piramidy
Tym razem omówimy zadanie z XII OIG.
Zadanie. Dana jest prostokątna plansza
o wymiarach
Wiersze zostały ponumerowane od 1 do
zaś kolumny od 1 do
Pole
znajduje się w lewym górnym rogu planszy. Niektóre pola mają przypisaną wartość
pozostałe wartość 0 (
oznacza wartość pola
). Zerowym kwadratem nazywamy kwadrat, który pokrywa tylko zera. Dla każdej liczby całkowitej
z przedziału
należy policzyć, ile jest zerowych kwadratów o boku 
Wstęp
Naszym zadaniem jest obliczenie wartości
gdzie
oznacza liczbę zerowych kwadratów o boku
Załóżmy przez chwilę, że dla każdego pola
mamy obliczoną wartość
- rozmiar największego zerowego kwadratu, którego prawym dolnym rogiem jest pole
Zauważmy, że pole
jest również prawym dolnym rogiem zerowych kwadratów o boku:
Rozważmy teraz ciąg
gdzie
oznacza liczbę wystąpień wartości
w tablicy 
Wówczas 
Sumy prefiksowe
Niech
oznacza sumę wartości w prostokącie, którego lewe górne pole ma współrzędne
zaś prawe dolne
Formalnie:
Obliczenie tablicy sum prefiksowych można zrealizować w czasie liniowym względem rozmiaru prostokąta, korzystając z poniższych zależności:
;
dla
;
dla
;![S[x][y] = A[x][y]](/math/temat/informatyka/algorytmy/2018/09/30/Piramidy/14x-e95ab2e8b63d63e073934ea7ff0dd7bbbec18b93-im-33,33,33-FF,FF,FF.gif)
jest sumą: wartości pola
prostokąta bez ostatniego wiersza, prostokąta bez ostatniej kolumny, pomniejszoną o sumę prostokąta bez ostatniego wiersza i ostatniej kolumny, który został dodany dwa razy.
Zastanówmy się teraz, jak za pomocą tablicy sum prefiksowych obliczyć sumę wartości w prostokącie w czasie stałym. Niech
będą prostokątami, których lewe górne pole ma współrzędne
zaś prawe dolne pole zostało wskazane na poniższym rysunku.
Załóżmy, że chcemy obliczyć sumę wartości w kolorowym prostokącie. Jest to
gdzie
oznacza sumę wartości w prostokącie 
Rozwiązanie 
W tym podejściu wyznaczymy wartości tablicy
przy wykorzystaniu metody wyszukiwania binarnego po wyniku. Załóżmy, że chcemy obliczyć wartość
dla ustalonych
Jeśli
wtedy
W przeciwnym przypadku
jest liczbą całkowitą z przedziału
Tę wartość możemy wyszukać binarnie po wyniku, korzystając z faktu:
Fakt. Jeśli
jest prawym dolnym rogiem zerowego kwadratu o boku
to jest również prawym dolnym rogiem każdego mniejszego zerowego kwadratu.
Sprawdzenie, czy
jest prawym dolnym rogiem zerowego kwadratu o boku
można wykonać za pomocą sum prefiksowych w czasie
Algorytm wyszukiwania binarnego wykona
takich faz. Wszystkich pól jest
zatem wyznaczenie tablicy
działa w czasie

Rozwiązanie dynamiczne 
W tym podejściu wyznaczymy wartości tablicy
przy wykorzystaniu metody programowania dynamicznego. Załóżmy, że chcemy obliczyć wartość
dla ustalonych
Jeśli
wtedy
W przeciwnym przypadku rozpatrujemy następujące możliwości.
- Jeśli
lub
wtedy
Dla wszystkich pól w pierwszym wierszu oraz w pierwszej kolumnie największy kwadrat ma rozmiar 
- Jeśli
oraz
wtedy ![[x][y]=1+min(D[x−1][y],D[x][y−1]). D](/math/temat/informatyka/algorytmy/2018/09/30/Piramidy/9x-d2647d627ae1147f0c8df96868f0873a42c0b48d-im-33,33,33-FF,FF,FF.gif)
- Jeśli
oraz
wtedy
gdzie
zaś
jeśli
i
w przeciwnym przypadku.
Obliczenie wartości
dla ustalonego
odbywa się w czasie
Plansza ma
pól, zatem wyznaczenie tablicy
działa w czasie 