Ich arbeite seit einiger Zeit an dynamischer Programmierung. Die kanonische Methode zum Auswerten einer dynamischen Programmierrekursion besteht darin, eine Tabelle mit allen erforderlichen Werten zu erstellen und zeilenweise zu füllen. Siehe zum Beispiel Cormen, Leiserson et al .: "Introduction to Algorithms" für eine Einführung.
Ich konzentriere mich auf das tabellenbasierte Berechnungsschema in zwei Dimensionen (zeilenweise Füllung) und untersuche die Struktur von Zellabhängigkeiten, dh welche Zellen durchgeführt werden müssen, bevor eine andere berechnet werden kann. Wir bezeichnen mit die Menge der Indizes von Zellen, von denen die Zelle abhängt. Beachten Sie, dass zyklenfrei sein muss.i Γ
Ich abstrahiere von der tatsächlich berechneten Funktion und konzentriere mich auf ihre rekursive Struktur. Formal halte ich eine Wiederholung für eine dynamische Programmierung, wenn sie die Form hat
mit , und eine (berechenbare) Funktion, die über .~ Γ d ( i ) = { ( j , d ( j ) ) | j ∈ Γ d ( i ) } f d ~ Γ d
Wenn man die Granularität von auf raue Bereiche (links, links oben, rechts oben, ... der aktuellen Zelle) einschränkt, stellt man fest, dass im Wesentlichen drei Fälle (bis zu Symmetrien und Rotation) gültig sind Dynamische Programmierrekursionen, die angeben, wie die Tabelle gefüllt werden kann:
Die roten Bereiche bezeichnen (Überapproximationen von) . In den Fällen eins und zwei werden Teilmengen zugelassen, in Fall drei ist der schlechteste Fall (bis zur Indextransformation). Beachten Sie, dass nicht unbedingt alle roten Bereiche von abgedeckt werden müssen . Einige Zellen in jedem roten Teil der Tabelle reichen aus, um sie rot zu zeichnen. Weiße Flächen sind explictly zu benötigt nicht enthalten alle erforderlichen Zellen.
Beispiele für den ersten Fall sind die Bearbeitungsentfernung und die längste gemeinsame Teilsequenz , für Bellman & Ford und CYK gilt der zweite Fall . Weniger offensichtliche Beispiele sind solche, die sich eher auf die Diagonalen als auf Zeilen (oder Spalten) beziehen, da sie gedreht werden können, um den vorgeschlagenen Fällen zu entsprechen. Siehe Joes Antwort für ein Beispiel.
Ich habe jedoch kein (natürliches) Beispiel für Fall drei! Meine Frage lautet also: Was sind Beispiele für drei dynamische Programmierrekursionen / -probleme?