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 ;
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
- 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