Je viens d'un milieu physique, et donc, beaucoup de mathématiques. Je trouve des problèmes faciles à repérer bien adaptés aux solutions de programmation récursive / dynamique en trouvant des similitudes avec la preuve par induction .
En preuve par induction vous avez deux parties:
- vous prouvez que si quelque chose est vrai pour l'itération N, c'est aussi vrai pour l'itération N + 1
- vous prouvez que c'est vrai pour l'itération 1
En programmation récursive / programmation dynamique:
- vous identifiez une condition de sortie (par exemple, vous câblez dur la solution pour l'itération 1)
- vous calculez la solution pour l'itération N étant donné la solution pour l'itération N-1
Ainsi, comme d'autres l'ont répondu, c'est une question d'expérience et de choix des indices, mais vous pouvez réutiliser d'autres compétences pour vous guider. Après cela, vous devez toujours avoir les deux parties que j'ai mentionnées: si vous ne le faites pas, cela ne fonctionnera pas.
Par exemple, pour générer toutes les permutations d'un ensemble:
- condition de sortie: si vous n'avez qu'un seul élément, renvoyez-le
- récursivité: les permutations d'un ensemble de N éléments sont les N ensembles de permutations que vous obtenez en choisissant chaque élément et en les combinant avec tous les N-1 ensembles de (nombreuses) permutations du sous-ensemble que vous obtenez en supprimant l'élément.
Je n'avais jamais implémenté un seul solveur de programmation dynamique - mes antécédents en mathématiques appliquées / physique / informatique numérique, pas en CS - jusqu'à il y a quelques années, lorsque j'ai commencé à résoudre des problèmes liés au projet Euler . Les problèmes solubles dans le DP là-bas (par exemple 76 , 158 , 161 , 242, mais il y en a beaucoup d'autres) s'est avéré être à peu près mon genre préféré. Vous êtes certainement mieux à même de repérer quand ce sera une technique utile: recherchez essentiellement des choses qui semblent pouvoir être résolues par une sorte d'approche récursive, diviser pour mieux régner, où il est également possible de dompter l'explosion de voies nécessitant à explorer en reconnaissant les sous-problèmes récurrents et en réutilisant les résultats précédemment calculés; être en mesure d'identifier le vecteur d'état minimal à mémoriser - et sur quelle "histoire" non pertinente peut être effacée - est l'étape cruciale.
la source