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

先看一条题目:

  (我将没用的信息过滤后,题目简化为:)求长度为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),与答案分析结果相符。

结语:

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