Я пытаюсь решить одну из «классических» задач динамического программирования. Проблема в том, что - учитывая число в качестве входных данных, генерировать возможные вложенные условия.
Edit: как указано в temp ниже, я собираюсь сначала попытаться разобраться с помощью рекурсии, а затем попробовать с динамическим программированием.
есть. если n = 3
O/p
((()))
()()()
(())()
()(())
(()())
Мой подход к проблеме основан на двух правилах.
- Добавьте скобку "(", если максимальное число (
тут 3) не дошел и номер
левых скобок меньше или равно
на количество правильных скобок.
- Добавлять правильную скобку, только если максимальное число
является
не достигнуто и номер прав
брекеты меньше количества левых
фигурные скобки.
Теоретически, они звучат правильно, но на приведенном ниже источнике он падает лицом вниз. Пожалуйста, извините за жесткое кодирование.
Редактировать: я сделал некоторые изменения и подвинулся на дюйм ближе к решению:)
#include <iostream>
#include <vector>
#include <string>
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<<s<<endl;
return;
}
else
{
if((l<3))
{
s+="<";
l = l+1;
printPar(l,r,s);
}
if(r<3 && r < l)
{
s+=">";
r = r+1;
printPar(l,r,s);
}
// cout<<"Exiting "<<l<<" & "<<r<<" "<<s<<endl;
}
}
int main()
{
string s;
printPar(0,0,s);
return 0;
}
Debug:
<<<>>>
<<<>>>
<<><>>
<<><>>
<><<>>
<><<>>
<><><>
<><><>
Я понимаю, почему в списке есть повторяющиеся значения. т.е. когда функция вызывается с использованием рекурсии и заканчивается выполнением следующей ветви. Второй отпечаток происходит из-за того, что функция самостоятельно падает на вторую ветвь. Есть ли способ справиться с этим? Я действительно не хочу идти по глобальному маршруту.
Кроме того, в моей голове этот код должен напечатать (()) () - но это не так: (
Может кто-нибудь указать на ошибку?
Спасибо!
Я знаю, что состояние нуждается в доработке, но я смотрел на это бесконечно. Halp!