Ric*_*o M 2 c++ algorithm recursion
我试图解决一个"经典"动态编程问题.问题是 - 给定一个数字作为输入,生成可能的嵌套条件.
编辑:正如下面的temp所指出的,我将首先尝试使用递归对其进行排序,然后尝试使用动态编程.
即.如果n = 3
O/p
((()))
()()()
(())()
()(())
(()())
Run Code Online (Sandbox Code Playgroud)
我对这个问题的处理方法基于两个规则.
从理论上讲,它们听起来是正确的,但它在下面的源头上是平坦的.请原谅硬编码.
编辑:我做了一些修改,并向解决方案移动了一英寸:)
#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;
}
Run Code Online (Sandbox Code Playgroud)
调试:
<<<>>>
<<<>>>
<<><>>
<<><>>
<><<>>
<><<>>
<><><>
<><><>
Run Code Online (Sandbox Code Playgroud)
我理解为什么列表中有重复的值.即一旦使用递归调用函数,并在执行时跟随下一个分支结束.第二次打印是由于它自身落在第二个分支上的功能.有办法处理这个吗?我真的不想走全球化的路线.
另外,在我脑海中这段代码应该打印(())() - 但它不会:(
有人可以指出错误吗?
谢谢!
我知道这种情况需要一些调整,但我一直在无休止地盯着这个.HALP!
目前,您的解决方案没有利用动态编程.如果你想在这里使用DP,你需要递归地思考这个问题.幸运的是,这个问题有一个很好的递归表达式:
(X)Y,其中X是一个i平衡括号Y的字符串,是一个字符串n - 我平衡括号.这个设置的美妙之处在于,要计算n + 1个平衡括号的所有字符串,你只需要知道如何为0,1,2,...,n + 1制作平衡括号.因此,你可以解决这个问题通过迭代构造n = 0,1,2,...等的解决方案,并重用您在前面步骤中生成的结果.
希望这可以帮助!