【算法专题】卡特兰数(计数数列)

Catalan数列:1 1 1 2 5 14 42 132 429 1430 4862 16796

【计数映射思想】

参考:卡特兰数 — 计数的映射方法的伟大胜利

计数映射:将难以统计的数映射为另一种形式的可以统计的数。

一、入栈出栈序

n个数字,有多少种合法的入栈出栈序列?n=3时的合法序列之一:+1,-1,+1,+1,-1,-1

对于n个数字,就是要在2n个1中添加n个“+”,则序列总数C(2n,n)。

对于未入栈先出栈的不合法情况,在其第一次前缀和为-1时,将前面的所有符号反转,此时整个序列有n+1个“+‘和n-1个’-‘,每个不合法序列都映射为2n个1中添加n+1个'+'构成的序列。

正向:每个不合法序列第一个前缀和为-1的位置反转后,形成的序列不同。

反向:每个含n+1个"+"的序列,第一个前缀和为1的位置反转后,形成的不合法序列不同。

所以得到卡特兰数:Cn=C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1)

例一、含n+1个节点的满二叉树形态数:中序遍历,向左+1向右-1,转化为入栈出栈序。

例二、圆上n个点连弦数:顺时针顺序每次+1和-1连弦,转化为入栈出栈序。

例三、n对括号表达式:左括号+1右括号-1,括号表达式组合数转化为入栈出栈序。

例四、n+1个数字连乘:结合n次即有n对有效括号,转化为括号表达式。

例五、凸n+2边形的三角剖分数:对边进行编号,然后顺时针扫描,实际上是n+1条边的连乘方案,转化为入栈出栈序。

二、不跨线路径数(几何模型)

入栈出栈序:考虑n*n的方格,从左下到右上不跨越对角线的路径数,向右记为+1,向上记为-1,跨越对角线就是前缀和为-1,则转化为入栈出栈序。

考虑n*m的方格,一条不合法路径在第一次跨越对角线的时候,将前面的路径翻转(上变左,左变上),那么就变成了到(n-1,m+1)的路径数。

那么f(n,m)=C(n+m,n)-C(n+m,n-1)。

 

【分治思想】

一个问题A,规模为n,可以用分治的思想,先固定一个元素,然后将剩下n-1个元素拆分成两个问题,根据固定的元素位置不同,两个问题分别是(0,n-1)(1,n-2)...(n-1,0)。

例一、入栈出栈序:固定最后出栈的数字是第k个加入的数,那么k前面是k-1个数的入栈出栈序问题,k后面是n-k个数的入栈出栈序问题,则有:

C(n)=C(0)*C(n-1)+C(1)*C(n-2)+...+C(n-1)C(0),即C(n)=ΣC(i)*C(n-i-1),i=0~n-1,C(0)=1

例二、凸n+2边形三角剖分数:先固定三角形V1VkVn+2,划分成凸k多边形和凸n+2-k边形,转化为Cn。

★总结:Catalan数的题目,一般从几种方式看出:转化为入栈出栈序,转化为几何不跨线路径数,定点分治思想,打表

posted @ 2018-01-06 09:36  ONION_CYC  阅读(1604)  评论(0编辑  收藏  举报