卡特兰数在括号串中的应用

本篇文章主要记录思路和一些自己的想法,没有具体代码,想看代码的可以叉掉了。


先看一条题目:

(我将没用的信息过滤后,题目简化为:)求长度为n的只包含'('')'的,且匹配括号数最多的,字符串的个数


分析:

如果有一定的算法经验的话,可以联想到:括号对数为N的括号匹配的字符串个数有C(N)个,其中C(N)为卡特兰数。

这里有个讲解卡特兰数的非常好的一篇文章:传送门

所以说n为偶数的情况很简单,答案就是C(n/2);

主要的难点在于n为奇数的情况。

n为奇数的时候,怎么办呢。

这里引用kouylan的讲解:题解【[JDWOI-2] 括号串】 - kouylan 的博客 - 洛谷博客 (luogu.com.cn)

 

说实话,这个思路的合理性直观来想很难觉得它合理。。。

反正我想了很久,觉得充分性马马虎虎,必要性有点难相通。

这里抛出我的一个思路:

  实际上,对于奇数个括号组成的匹配括号数最多的字符串,它都可以归结于整个字符串最左边或者最后边缺少一个左括号或者右括号,换句话说,如果在最左边或者最右边增加一个左括号或者右括号,都可以使其成为完全匹配的括号字符串。(可以从  使用栈方法   检验匹配括号字符串的  思路上去考虑这个说法,从-1 ,1  的方法 也可以考虑得通)。

那么就好办了,当n为奇数时,考虑n+1个括号完全匹配的字符串数,然后分别将里面的字符串减去最左边的括号或者最右边的括号即可得到n个括号的最多括号匹配字符串。

所以答案很显然就是2*C((n+1)/2),与答案分析结果相符。


结语:

总之,说了这么多,要想拿下相关题目还是得熟练掌握使用乘法逆元计算出大数的卡特兰数的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡咖_CoffCa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值