Od jakiegoś czasu pracuję nad programowaniem dynamicznym. Kanonicznym sposobem oceny dynamicznej rekurencji programowania jest utworzenie tabeli wszystkich niezbędnych wartości i wypełnienie jej wiersz po wierszu. Zobacz na przykład Cormen, Leiserson i in .: „Wprowadzenie do algorytmów” .
Skupiam się na opartym na tabeli schemacie obliczeń w dwóch wymiarach (wypełnianie wiersz po rzędzie) i badam strukturę zależności między komórkami, tj. Które komórki należy wykonać, zanim można obliczyć inny. Oznaczamy za pomocą zestaw wskaźników komórek, od których zależy komórka . Pamiętaj, że musi być wolna od cyklu.
Abstrahuję od obliczonej faktycznej funkcji i koncentruję się na jej strukturze rekurencyjnej. Formalnie uważam, że nawrót jest programowaniem dynamicznym, jeśli ma taką formę
z , i niektóre (obliczalne) funkcje, które nie używają inne niż przez .
Ograniczając ziarnistość do szorstkich obszarów (po lewej, u góry po lewej, u góry, u góry po prawej, ... w bieżącej komórce) należy zauważyć, że istnieją zasadniczo trzy przypadki (do symetrii i obrotu) dynamiczne rekurencje programowania, które informują o sposobie wypełnienia tabeli:
Czerwone obszary oznaczają (nadmierne przybliżenia) . Przypadki pierwszy i drugi dopuszczają podzbiory, przypadek trzeci to najgorszy przypadek (do transformacji indeksu). Pamiętaj, że nie jest bezwzględnie wymagane, aby całe czerwone obszary były objęte ; niektóre komórki w każdej czerwonej części tabeli są wystarczające, aby pomalować ją na czerwono. Białe obszary są wyraźnie wymagane, aby nie zawierały wymaganych komórek.
Przykładami przypadku pierwszego są odległość edycji i najdłuższy wspólny podciąg , przypadek drugi dotyczy Bellman i Forda oraz CYK . Mniej oczywiste przykłady obejmują takie, które działają na przekątnych, a nie na rzędach (lub kolumnach), ponieważ można je obracać w celu dopasowania do proponowanych przypadków; zobacz odpowiedź Joe na przykład.
Jednak nie mam (naturalnego) przykładu dla przypadku trzeciego! Więc moje pytanie brzmi: jakie są przykłady przypadków / problemów z dynamicznym programowaniem w przypadku trzecim?