J'ai utilisé la technique de la programmation dynamique à plusieurs reprises, mais aujourd'hui, un ami m'a demandé comment je définissais mes sous-problèmes. Je me suis rendu compte que je n'avais aucun moyen de fournir une réponse formelle objective. Comment définissez-vous formellement un sous-problème pour un problème que vous voudriez résoudre en utilisant la programmation dynamique?
algorithms
dynamic-programming
Daniel Gratzer
la source
la source
Réponses:
Le principe de la programmation dynamique est de penser de haut en bas (c'est-à-dire de manière récursive) tout en résolvant de bas en haut. Une bonne stratégie pour concevoir un PDD consiste donc à formuler le problème de manière récursive et à générer ainsi des sous-problèmes.
la source
Comme @Suresh l'a fait remarquer, une fois que vous savez que votre problème peut être résolu par DP (c'est-à-dire qu'il présente une sous-structure optimale et des sous-problèmes qui se chevauchent), vous pouvez penser à une solution récursive de division et de conquête.
Bien sûr, diviser pour régner sera extrêmement inefficace, car chaque sous-problème rencontré dans l’arbre de récursion associé sera résolu à nouveau, même s’il a déjà été trouvé et résolu. C'est là que DP diffère: chaque fois que vous rencontrez un sous-problème, vous le résolvez et stockez sa solution dans un tableau. Plus tard, lorsque vous rencontrez à nouveau ce sous-problème, vous accédez en temps sa solution au lieu de la résoudre à nouveau. Étant donné que le nombre de sous-problèmes qui se chevauchent est généralement limité par un polynôme et que le temps nécessaire pour résoudre un sous-problème est également polynomial (sinon, DP ne peut pas fournir une solution rentable), vous obtenez généralement une solution polynomiale.O (1)
Par conséquent, le fait de penser à une solution de division et de conquête vous donnera une idée de ce qu’est un sous-problème pour votre problème particulier.
la source
Mon expérience est de trouver un moyen de "réduire l'énumération redondante à l'aide de la sauvegarde de la valeur utile déjà énumérée". À propos, la programmation dynamique est très populaire dans le concours international de programmation collégiale ICPC. Tout le monde peut avoir son propre sentiment à propos de DP après la pratique de plusieurs problèmes de CIPC.
la source