n个圆括号序列由n“(”s和n“)组成。动态规划:计算第k个括号序列
有效括号序列定义为以下:
可以找到一种方式来重复擦除相邻对括号“()”,直到它变空。例如,“(())”是一个有效的圆括号,您可以在第二和第三个位置擦除该对,然后它变为“()”,然后您可以将其设为空。 ()“()(”不是一个有效的括号,在你擦除第二和第三个位置上的对之后,它就变成了“)(”并且你不能再擦除
现在,我们有全部有效的括号。序列查找字典顺序第k个最小序列
例如,以下是字典顺序所有有效3个括号序列:
((()))
(()())
(())()
()(())
()()()
来源:https://code.google.com/codejam/contest/4214486/dashboard#s=p3
注:比赛在现在在...之上nd解决方案可供下载。
我已经通过使用在C++ STL中可用的next_permutation()解决了它的小输入问题(k )。我无法为此制定一个小问题。我试图通过使用加泰罗尼亚号码解决这个问题,但似乎没有取得任何成功。我不想看到解决方案,因为它不利于学习。请帮助我确定一个子问题。
哪里第一闭括号?你有'n/2'的位置可以容纳它。因此,你有'u(n)= n/2 * u(n-2)'。然后删除第一个“()”子串并获得一个“n-2”有效序列。这个子字符串中的第一个右括号在哪里,你仍然有'(n-2)/ 2'选择!等等。 – Rerito 2014-10-18 07:29:23