Festlegen von Unterproblemen für die dynamische Programmierung

39

Ich habe die Technik des dynamischen Programmierens mehrmals angewendet, aber heute fragte mich ein Freund, wie ich meine Unterprobleme definiere. Mir wurde klar, dass ich keine Möglichkeit hatte, eine objektive formale Antwort zu geben. Wie definieren Sie formal ein Unterproblem für ein Problem, das Sie mit dynamischer Programmierung lösen würden?

jozefg
quelle
Es sieht so aus, als ob keine der vorhandenen Antworten (Stand April 2019) gut genug ist, insbesondere für Anfänger. Ich würde Tutorials auf anderen Websites empfehlen.
Apass.Jack

Antworten:

35

Das Prinzip der dynamischen Programmierung besteht darin, von oben nach unten (dh rekursiv) zu denken, aber von unten nach oben zu lösen. Eine gute Strategie zum Entwerfen eines DP besteht darin, das Problem rekursiv zu formulieren und auf diese Weise Unterprobleme zu generieren.

Suresh
quelle
14
Ich behaupte, das ist die einzige Strategie.
JeffE
2
@JeffE Ja, ich habe Ihre Notizen gelesen und verwendet, als ich meine Algorithmusklassen unterrichtete, und sie waren effektiv. Zitat: "Bei Dynamic geht es nicht darum, Tabellen auszufüllen. Es geht um intelligente Rekursion!"
Dai
2
Mein Verständnis, wie man DPs unterrichtet, ist STARK beeinflusst von @ JeffEs Notizen :)
Suresh
3
Es ist auch möglich, eine rekursive Prozedur von oben nach unten automatisch in einen dynamischen Programmieralgorithmus umzuwandeln. Speichern Sie die Antwort in einer Hash-Tabelle, wenn Sie zurückkehren möchten. Überprüfen Sie zu Beginn jedes Aufrufs, ob die Antwort bereits in der Hash-Tabelle enthalten ist, und geben Sie sie in diesem Fall sofort zurück. Viele Algorithmen werden mit dieser Idee einfach. Beispielsweise funktionieren bei einer solchen Tabelle rekursive Algorithmen bei Versuchen automatisch in DAWGs. Durch Speichern eines Sentinel-Werts in der Tabelle zu Beginn eines Aufrufs können dieselben Algorithmen auch für DFAs verwendet werden. Algorithmen auf BDDs können sehr einfach rekursiv angegeben werden.
Jules
1
Last but not least kann dies enorme Leistungsvorteile haben. Beispielsweise kann der herkömmliche Bottom-Up-Teilmengen-Summenalgorithmus Tonnen von nicht benötigten Tabelleneinträgen berechnen. Mit dieser Methode werden nur die notwendigen Tabelleneinträge berechnet.
Jules
4

Wenn Sie wissen, dass Ihr Problem durch DP gelöst werden kann (dh, es weist eine optimale Unterstruktur und überlappende Unterprobleme auf), können Sie, wie @Suresh betonte, an eine Teilung denken und eine rekursive Lösung erobern.

O(1)

Wenn Sie also über eine Lösung zum Teilen und Überwinden nachdenken, erhalten Sie einen Einblick, was für ein Unterproblem für Ihr spezielles Problem sein kann.

Massimo Cafaro
quelle
1
Eine "optimale Unterstruktur" (was auch immer das bedeutet) ist wahrscheinlich keine ausreichende Bedingung für die DP-Lösbarkeit. "Überlappende Teilprobleme" sind sicherlich nicht notwendig.
Raphael
1
Optimale Unterstruktur und überlappende Probleme zeigen sich durch Probleme, die von DP effizient gelöst werden können. Eine optimale Unterkonstruktion allein reicht für die Lösbarkeit von DP natürlich nicht aus. Wenn Sie jedoch keine überlappenden Unterprobleme haben, können Sie das Problem durch gewöhnliches Teilen und Erobern mit denselben Kosten lösen: Der Vorteil von DP gegenüber dem Teilen einer Eroberung besteht darin, dass jedes Unterproblem genau einmal gelöst wird, wenn es im Rekursionsbaum auftritt .
Massimo Cafaro
1
Es ist nicht meine Formulierung: Sie finden sie in "Introduction to algorithms" von Cormen, Leiserson, Rivest und Stein und in vielen anderen Lehrbüchern über Algorithmen.
Massimo Cafaro am
1
Jup, und die meisten liegen zumindest teilweise falsch. Ich freue mich darauf, wenn Sie eine passende Frage stellen.
Raphael
1
Ich bin nicht sicher, ob ich Ihren letzten Kommentar richtig verstanden habe. Um zu zeigen, dass diese Art der Charakterisierung falsch ist (es kann nicht teilweise falsch sein: entweder ist es richtig oder es ist falsch), können Sie einfach als ein Gegenbeispiel zeigen, ein Problem, das nicht sowohl eine optimale Unterstruktur als auch überlappende Unterprobleme aufweist, aber es ist einer polynomiellen DP-Lösung zugänglich. Beachten Sie jedoch, dass dies in diesem Zusammenhang eine Lösung bedeutet, die nachweislich besser ist als gewöhnliches Teilen und Erobern.
Massimo Cafaro
2

Meine Erfahrung besteht darin, einen Weg zu finden, um "redundante Aufzählungen mithilfe der Speicherung von bereits aufgelisteten nützlichen Werten zu reduzieren". Übrigens, Dynamic Programming ist bei ICPC (International Collegiate Programming Contest) sehr beliebt. Jeder kann nach dem Üben verschiedener ICPC-Probleme ein eigenes Gefühl für DP entwickeln.

Peng Zhang
quelle