Re: [问题] 新手解题请教

楼主: flarehunter (Range)   2019-11-02 08:35:20
※ 引述《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
作者: cutekid (可爱小孩子)   2019-11-02 13:04:00
赞赞赞,厉害(Y)!
作者: kaney (转换跑道)   2019-11-02 18:06:00
好棒! 太感谢了,先笔记起来~
作者: manmay (书诚)   2019-11-03 19:05:00
如果对数学有兴趣的话可以google 卡塔兰数 逻辑是有相关的
作者: kaney (转换跑道)   2019-11-04 18:49:00
好的,我去看看~谢谢 :)

Links booklink

Contact Us: admin [ a t ] ucptt.com