Je suis en train de résoudre l'un des problèmes de programmation dynamique "classiques". Le problème est - Étant donné un nombre en entrée, générer des conditions imbriquées possibles.
Édition : Comme l'a souligné temp ci-dessous, je vais d'abord essayer de résoudre cela en utilisant la récursion, puis essayer avec la programmation dynamique.
Par exemple, si n = 3
Sortie :
((()))
()()()
(())()
()(())
(()())
Ma démarche pour résoudre le problème repose sur deux règles.
- Ajouter une parenthèse ouvrante "(" si le nombre maximum (ici 3) n'est pas atteint et que le nombre de parenthèses gauches est inférieur ou égal au nombre de parenthèses droites.
- Ajouter une parenthèse fermante uniquement si le nombre maximal n'est pas atteint et que le nombre de parenthèses droites est inférieur au nombre de parenthèses gauches.
En théorie, cela semble correct, mais cela échoue lamentablement sur la source ci-dessous. Veuillez excuser le codage en dur.
Édition : J'ai apporté quelques modifications et me suis rapproché un peu plus de la solution :)
#include
#include
#include
using namespace std;
void printPar(int l,int r,string s)
{
if(l > 3 || r > 3 || r >l)
return;
if(l==3 && r==3)
{
cout<
`
Debug :
<<<>>>
<<<>>>
<<><>>
<<><>>
<><<>>
<><<>>
<><><>
<><><>
Je comprends pourquoi il y a des valeurs en double dans la liste, c'est-à-dire une fois que la fonction est appelée en utilisant la récursion et finit par suivre la prochaine branche lors de l'exécution. La deuxième impression est due à la fonction elle-même tombant sur la deuxième branche. Y a-t-il un moyen de gérer cela ? Je ne veux vraiment pas passer par la voie globale.
Aussi, dans ma tête, ce code devrait afficher (())() - pourtant il ne le fait pas :(
Quelqu'un pourrait-il pointer l'erreur ?
Merci !
Je sais que la condition a besoin de quelques ajustements, mais je regarde cela sans fin. Aidez-moi !
`