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