Ich komme aus der Physik und damit aus der Mathematik. Ich finde es einfach, Probleme zu erkennen, die für rekursive / dynamische Programmierlösungen gut geeignet sind, indem ich Ähnlichkeiten mit Beweis durch Induktion finde .
Im Induktionsnachweis haben Sie zwei Teile:
- Sie beweisen, dass wenn etwas für die Iteration N zutrifft, dies auch für die Iteration N + 1 zutrifft
- Sie beweisen, dass dies für Iteration 1 zutrifft
In rekursiver Programmierung / dynamischer Programmierung:
- Sie identifizieren eine Austrittsbedingung (Sie verdrahten beispielsweise die Lösung für Iteration 1).
- Sie berechnen die Lösung für die Iteration N unter Angabe der Lösung für die Iteration N-1
Wie andere geantwortet haben, ist es eine Frage der Erfahrung und der Auswahl der Hinweise, aber Sie können andere Fähigkeiten als Leitfaden verwenden. Danach müssen Sie immer die beiden Teile haben, die ich erwähnt habe: Wenn Sie das nicht tun, wird es nicht funktionieren.
So generieren Sie beispielsweise alle Permutationen einer Menge:
- Ausgangsbedingung: Wenn Sie nur ein Element haben, geben Sie es zurück
- Rekursion: Die Permutationen einer Menge von N Elementen sind die N Mengen von Permutationen, die Sie erhalten, indem Sie jedes Element auswählen und die mit allen N-1 Mengen von (vielen) Permutationen der Teilmenge kombinieren, die Sie erhalten, indem Sie das Element entfernen.
Bis vor einigen Jahren, als ich anfing, Probleme mit Project Euler zu lösen, hatte ich noch keinen einzigen Löser für dynamische Programmierung implementiert - mein Hintergrund ist Mathematik / Physik / numerisches Rechnen, nicht CS . Die DP-lösbaren Probleme gibt es (zB 76 , 158 , 161 , 242Es stellte sich heraus, dass es so ziemlich meine Lieblingssorte ist. Das Erkennen ist definitiv besser, wenn es sich um eine nützliche Technik handelt: Suchen Sie im Grunde nach Dingen, die durch einen rekursiven Divide-and-Conquer-Ansatz gelöst werden könnten, bei dem es auch möglich ist, die Explosion der benötigten Pfade zu zähmen erkundet werden, indem wiederkehrende Teilprobleme erkannt und die zuvor berechneten Ergebnisse wiederverwendet werden; In der Lage zu sein, den minimalen Zustandsvektor zu identifizieren, auf dem man sich einprägen kann - und welcher irrelevante "Verlauf" gelöscht werden kann -, ist der entscheidende Schritt.
quelle