Dynamische Programmierung Basierend auf dem Bellmansches Optimalitätsprinzip: „Optimale Teillösungen bilden eine optimale Lösung.“ LgT Geg.: Wörter a, b Ges.: Längste gemeinsame Teilfolge LgT(a, b) Idee: C(i, j) ≡ LgT(a1…ai, b1…bj) sei bekannt C (i, 0) = C (0, j) = 0 falls a i = b j C (i - 1, j - 1) + 1 C (i, j) = max{ C (i - 1, j), C (i, j - 1) } falls a i ≠ b j KgO Geg.: Wörter a, b Ges.: Kürzeste gemeinsame Oberfolge KgO(a, b) Idee: C(i, j) ≡ KgO(a1…ai, b1…bj) sei bekannt C (i, 0) = i C (0, j) = j falls a i = b j C (i - 1, j - 1) + 1 C (i, j) = min{ C (i - 1, j) + 1, C (i, j - 1) + 1} falls a i ≠ b j Editierdistanz Geg.: Wörter a, b Ges.: Geringste Anzahl Operationen (Löschen, Einfügen, Umbenennen) zur Überführung von Wort a nach b (= Maß für die Ähnlichkeit von a und b) Idee: C(i, j) ≡ Edd(a1…ai, b1…bj) sei bekannt C(i-1, j-1) - Umbenennen von ai nach bj C(i-1, j) - Löschen von ai C(i, j-1) - Einfügen von bj C (i, 0) = i C (0, j) = j falls a i = b j C (i - 1, j - 1) C (i, j) = min{ C (i - 1, j - 1) + 1, C (i - 1, j) + 1, C (i, j - 1) + 1} falls a i ≠ b j TSP Geg.: Kostenmatrix K mit K(a, b) = Kosten der „Strecke“ a nach b Ges.: Optimale (günstigste) Rundreise Idee: Optimaler Pfad Pn(i, V) der Länge n vom Knoten 1 zum Knoten i bekannt, wobei ∀ v∈V gilt: v∉Pn Pn(i, ∅) = K(i, 1) Pn(i, V) = min{K(i, v) + Pn+1(v, V \ v) | ∀ v∈V } schließen des Kreises expandieren des Pfades Iterierte Matrizenmultiplikation Geg.: n Matrizen Ai ∈ Νi-1×i Ges.: Berechnung von B = A1×A2×…×An durch minimale Anzahl Multiplikationen M Idee: Ai Ai×Ai+1 Ai×Aj×Ak mit 0 Multiplikationen berechenbar mit (i-1) × i × (i+1) Multiplikationen berechenbar ( p i-1 ⋅ p i ⋅ p i +1 ) durch Ai×(Aj×Ak) oder (Ai×Aj)×Ak berechenbar … 0 falls i ≥ j M (i, j) = min{M (i, k) + M (k + 1, j) + p i-1 ⋅ p k ⋅ p j | i ≤ k < j } falls i < j Optimaler binärer Suchbaum Geg.: Knoten ai und dazu gehörige Häufigkeiten bi (i = 1,…,n) Ges.: Optimaler Suchbaum S mit minimalen Kosten c ~ Häufigkeiten × Tiefe ∀ Knoten ai Idee: C(i, j) ≡ S(ai…aj) sei minimaler Suchbaum welcher die Knoten ai bis aj enthält 0 falls i > j C (i, j) = j ∑ c n + min{C (i, k - 1), C (k + 1, j) | i ≤ k ≤ j } falls i ≤ j n =i