Muster in der dynamischen Programmierung - 2


Diskleimer: Das nachfolgend beschriebene Verfahren ist nicht universell, kann aber oft die Herausforderung erfüllen oder die richtige Lösung erreichen.

Wenn Sie in der Aufgabe aufgefordert werden, zu zerstören/stop/seal (oder ähnliche) Fülle, es lohnt sich zu versuchen, es durch dynamische Sublet-Programmierung zu erreichen.

Wir haben dp[l][r] - die beste Antwort für einen Unterabschnitt mit Indizes von l bis r. Die Neuberechnung der Dynamik hängt stark von der Aufgabe ab, aber es gibt folgende allgemeine Ideen:

(1) Um sich die Extreme l und r anzusehen. Wenn sie zusammenfallen oder weiterkompliziert sind, ist es wahrscheinlich, dass die dp[l][r] über dp[l+1][r-1] aktualisiert werden kann. Andernfalls durch dp[l][r-1] oder dp[l+1[r].

(2) Es ist oft möglich, dass der Schnitt [l;r] nicht durch ein einziges Design dargestellt werden kann. Alle möglichen Abschnitte dieses Unterabschnitts sollten dann berücksichtigt werden, d.h. das Element k von l bis r-1 zu entfernen und dp[l][r] durch dp[l][k] und dp[k+1][r] zu zählen. Diese Abschnitte wurden auch in kleineren Schnitten neu berechnet und in der Tat werden die Abschaltmöglichkeiten [l;r] berücksichtigt, nicht nur für zwei Teile, sondern für jede Zahl.

Diskleimer: Das nachfolgend beschriebene Verfahren ist nicht universell, kann aber oft die Herausforderung erfüllen oder die richtige Lösung erreichen.

Wenn Sie die Existenz eines Resets überprüfen oder eine Reihe von geeigneten Umkehrungen oder etwas finden müssen, sollten Sie über die Anwendung der dynamischen Programmierung für Multiplikatoren nachdenken.

Der Hauptparameter wird die Kampfmaske sein, die zeigt, welche Elemente bereits in der Konversion enthalten sind und welche nicht. Oft ist auch ein zweiter Parameter erforderlich, der zeigt, was das letzte Element war.

Häufige Reklamation ist im Kontext von Graphen zu erkennen. Wir werden daher ein klassisches Beispiel, eine Gambilleton-Straße betrachten.
Hamiltons' Reise ist ein einfacher Weg durch jede Reihe der Zählung einmal. Es kann sich nur als Umwandlung der Länge n vorstellen, wobei n die Anzahl der Spitzen ist. Die Reihenfolge innerhalb dieses Rücksetzens gibt an, wie die Gipfel passieren.

Um die Existenz einer Hamilton-Straße in der Box zu überprüfen, werden wir dp[mask][last] - gibt es einen einfachen Weg, der die in der Fledermausmaske markierten Spitzen bestanden hat und am oberen Ende endete.
Anfangswerte werden dp[2I][i] = wahr, der Rest ist falsch, was bedeutet, dass es immer einen leeren Pfad gibt, der an einem der Oberseiten beginnt.
Mit der Bedeutung von wahr in dp[mask][letzte] werden wir die Übergänge nach vorne im Sinne von "verkaufter Straße" machen. Wir suchen also nach der Anzahl der Spitzen, die in der Maske vernichtet werden (wir haben sie nicht im Weg besucht) und dass es eine Rippe von letzter bis zu dieser Spitze gibt (die Menge muss durch die vorhandene Rippe erweitert werden). Wir tun dp[mask есть 2k.][k] = wahr, wenn dp[mask][last] = true und mask 2k. = 0 (über k noch nicht besucht) Und es gibt eine Rippen-Letzt-national k.
Letztlich sind Hamiltons auf dem Weg, wenn es einen Wert in dp auf die Parameter einer Kampfmaske gibt, die nur aus Einheiten und jedem letzten Peak besteht.