※ 引述《kaney (蘇老師)》之銘言:
:  各位python前輩們好,第一次在python版發文
:  小弟是剛自學python不久的初學者(之前0相關基礎)
:  僅有看了coursera一個specialization 'Python for everybody'
:  跟run了一遍codecademy的learn python
:  一位朋友說可以先試著做做題目,然後推薦了我高中生程式解題系統
:  我從基礎問題做起,目前有遇到幾個困難,希望不會太打擾大家
:  題目1: https://zerojudge.tw/ShowProblem?problemid=a229
:  我的code: https://ideone.com/ehkyc7
:  *腦中第一時刻浮現排列組合,上網找了下可用的方法後寫了這個
:   不過在測資不大時可以跑完,測資數值大的時候直接memory error
:   有想過從左開始一步步加括號,然後判定是否合理,
:   但是不知道要怎麼實現,例如第一畫左之後,第二畫可以加左也能加右要怎麼判斷
這題除了遞迴以外,也可以用DP的做法
觀察一下n=3的例子
用第一個括號來分組的話,可以看出來規律是這樣
裡面有兩個括號,後面沒有括號
( (()) )
( ()() )
裡面有一個括號,後面有一個括號
( () )()
裡面沒有括號,後面有兩個括號
()(())
()()()
而n=2的答案是
(())
()()
n=1的答案是
()
n=0的答案是什麼都沒有(i.e. 空字串)
所以說,如果我們已經先算出0~n-1的答案的話
那n的答案就是:
( 所有n-1的答案 ) 所有0的答案
( 所有n-2的答案 ) 所有1的答案
...
( 所有n-i-1的答案 ) 所有i的答案
...
( 所有0的答案 ) 所有n-1的答案
實作上,我們只要從小算到大,就可以保證在算n的時候0~n-1都已經算完了
results = [['']] # result of n=0
for n in range(1, 13+1): # calculate until n=13
    result = []
    for i in range(n):
       for outside in results[i]:
          for inside in results[n - i - 1]:
             result.append('(' + inside + ')' + outside)
    results.append(result)
    print n, result