作者flarehunter (Range)
看板Python
标题Re: [问题] 新手解题请教
时间Sat Nov 2 08:35:20 2019
※ 引述《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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 126.74.152.122 (日本)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1572654922.A.E86.html
※ 编辑: flarehunter (126.74.152.122 日本), 11/02/2019 08:39:25
※ 编辑: flarehunter (126.74.152.122 日本), 11/02/2019 08:45:40
※ 编辑: flarehunter (126.74.152.122 日本), 11/02/2019 08:46:43
1F:推 cutekid: 赞赞赞,厉害(Y)! 11/02 13:04
2F:推 kaney: 好棒! 太感谢了,先笔记起来~ 11/02 18:06
3F:推 manmay: 如果对数学有兴趣的话 11/03 19:05
4F:→ manmay: 可以google 卡塔兰数 逻辑是有相关的 11/03 19:06
5F:推 kaney: 好的,我去看看~谢谢 :) 11/04 18:49