卡特兰数总结

卡特兰数(Catalan number)

一.公式

1.递推公式:h(n)=h(0)*h(n-1)+h(1)*h(n-2)+…h(1)*h(n-2)+h(n-1)*h(0),n>=2

   其中:h(1)=h(0)=1

2.组合公式:h(n)=C(2*n,n)-C(2*n,n+1),n>=1

二.理解

1.递推公式理解—出入栈问题

题目链接:HDU 1023 Train Problem ll

问题描述:编号为1-n的n列火车以升序序号入栈,问有多少种出栈方式?

理解:假如最后出栈的火车是编号为k的火车,则编号比k小的火车在k入栈之前就已离栈,有h(k-1)种离栈方式,编号比k大的火车在k入栈之后才离栈,有h(n-k)种离栈方式,则编号为k的火车最后出栈时共有h(k-1)*h(n-k)种方式,现取k=1~n,则h(n)=h(0)*h(n-1)+h(1)*h(n-2)+…h(1)*h(n-2)+h(n-1)*h(0)。

延伸:

-)题目链接:HDU 1130 How Many Trees?

问题描述:编号为1-n的n个结点可以构成多少种不同的二叉搜索树?(二叉搜索树即该树上每个结点左子树上的结点编号均小于该结点,右子树上的结点编号均大于该结点)

理解:假如编号为k的结点为根结点,则编号比k小的结点在k结点的左子树上,有h(k-1)种左子树,编号比k大的结点在k结点的右子树上,有h(n-k)种右子树,则编号为k的结点作为根结点时共有h(k-1)*h(n-k)种二叉搜索树,现取k=1~n,则h(n)=h(0)*h(n-1)+h(1)*h(n-2)+…h(1)*h(n-2)+h(n-1)*h(0)。

-)题目链接:HDU 1131 Count the Trees

问题描述:n个不同的结点可以构成多少种不同的二叉树?

理解:在上一题的基础上再乘以n!即可,因为上面的问题等价于“n个相同的结点可以构成多少种不同的二叉树”,现在是n个不同的结点,所以乘以n!(也可以理解为上一题中得出的每一种树的结点是有一定顺序的,而现在顺序可以打乱,有n!种排序方式)。

-)题目链接:HDU 1134 Game of Connections

问题描述:值为1~2*n的2*n个数字围成一个圈,现在要在这个圈内画n条直线,每条直线连接两个数字,把这2*n个数字两两分组分为n组,要求每一个数字有唯一的“队友”,且n条直线两两之间不能相交。

理解:设数字1与数字2*k(k=1,2…且k<=n)为一组(注意到1不可能与某一个奇数分到一组,因为这样1与该奇数之间会剩余奇数个数,剩余这奇数个数不能两两组队,也不能与1跟该奇数之间的直线相交而与另外一边的数相连组队),则在1与2*k之间剩余(2*k-2)个数,这(2*k-2)个数有h((2*k-2)/2)即h(k-1)种连线方式(h后括号里的数应与最开始的n的含义保持一致,所以剩余(2*k-2)时相当于'n'=(2*k-2)/2=k-1),在1与2*k的另外一边有(2*n-2*k)个数,这(2*n-2*k)个数有h((2*n-2*k)/2)即h(n-k)种连接方式,所以当1与2*k相连时共有h(k-1)*h(n-k)种连接方式,现取k=1~n,则h(n)=h(0)*h(n-1)+h(1)*h(n-2)+…h(1)*h(n-2)+h(n-1)*h(0)。

2.组合公式理解—设置1、0状态的问题

题目链接:HDU 1023 Train Problem ll

问题描述:编号为1-n的n列火车以升序序号入栈,问有多少种出栈方式?

理解:该题也可以设置1、0状态来理解,把火车入栈设为1,把火车出栈设为0,入一辆火车便记下一个1,出一辆火车便记下一个0,则记录下的1的个数应当始终大于等于0的个数。由于有n辆火车,所以1的总个数应该为n,0的总个数也为n,先单看这n个1和n个0的排列,有C(2*n,n)种排列方式,然后要去掉不合题意的排列,不合题意的排列应当满足在第(2*k+1)位时刚好前面0的个数大于了1的个数,即刚好此时前面有(k+1)个0,k个1,后面有(n-k-1)个0,(n-k)个1,现在做一个变换,把后面的0和1互换一下(即1换为0,0换为1),则后面有(n-k)个0,(n-k-1)个1,此时该序列种共有(n+1)个0,(n-1)个1,如序列(100110)变换后得到(100001),可以推想,对于每一种不合题意的序列,都有唯一对应的含有(n+1)个0与(n+1)个1的变换序列,因此不合题意的序列数为C(2*n,n+1),综上得到h(n)=C(2*n,n)-C(2*n,n+1)。

延伸:

-)题目链接:HDU 1133 Buy the Ticket

问题描述:有m+n个人到一个地方买烧饼,烧饼50元一个,这m+n个人中有m个人只有50元,n个人只有100元,烧饼处一开始没有零钱,问有多少种排队方式可以让每个只有100元的人买烧饼时都有50元零钱找?

理解:把来一个只有50元的人记为1(进50元),来一个只有100元的人记为0(出50元),则记录下的1 的个数要大于等于0的个数,当m<n时明显无解,当m>=n时跟上面的推导过程一致,得出排列方式有h(n)=C(m+n,m)-C(m+n,m+1)种,由于每个人不一样,所以最终还要乘以m!*n!。

-)题目链接:HDU 2067 小兔的棋盘

问题描述:小兔有个坐标棋盘,现在小兔想要从坐标点(0,0)沿坐标方格格线(不走对角线)走到(n,n),规定不能穿过y=x这条直线,但可以碰触到该线上的点,有多少种最短路径走法?

理解:(按理说不穿越y=x这条直线应该在(0,0)位置时就不能往上走,否则就算穿过了y=x这条直线,但也不一定,看题目来,比如这道题就可以在(0,0)出往上走)由于是最短路径走法,所以只需要向右累计走n步向上累计走n步共2*n步,然后把向右走设为1,向上走设为0,先不考虑在(0,0)处可以向上走的情况,要不穿过y=x所以1出现的个数要大于等于0,则跟上面一样有h(n)=C(2*n,n)-C(2*n,n+1)种,由于在(0,0)处可以向上走,所以还要乘以2(向上走不穿过y=x应该有0出现的个数大于等于1,由于0的总个数等于1的总个数,因此与1出现的个数大于等于0时的情况等价,也为C(2*n,n)-C(2*n,n+1)种)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值