排列组合-9.6 卡特兰数问题

先以几个例子来说明卡特兰数问题

例一:

n个数进出栈的顺序有多少种?假设栈的容量无限大。

给定一个整数n,请返回所求的进出栈顺序个数。保证结果在int范围内。

答:n个数进栈、出栈,总共有2n种操作。从其中挑选出n个操作为进栈(注意入栈和出栈操作数目是相等的,只是顺序不同),则总共有C_{2n}^{n} 种可能。但是其中必然有一些不合法的进出栈顺序,即栈为空时仍然出栈。假设入栈记为+1,出栈记为-1,当n = 6 一种不合法的入栈出栈顺序可以记为:+1 -1 -1 +1 +1 -1。前3个数的和等于-1。

如果我们将前缀和等于-1的部分取反,那么由于取反前该部分中+1比-1的数目少了一个,所以取反后整个序列中+1的数目比-1多了两个,即变为:-1 +1 +1 +1 +1 -1。于是不合法的进出栈顺序问题变为了:在2n个位置上选取n+1个记为+1,剩下的记为-1,有多少种可能?用总的顺序数减去不合法顺序数,就是合法的顺序数目,即C_{2n}^{n}-C_{2n}^{n+1}。而合法的进出栈顺序中,出栈时栈必不为空,前缀和不可能小于零,因此找不到一个序列,翻转后+1数目比-1多2。

例二:

一个点从(0,0)出发到达(n,n),只能向上走或向右走,且在任意一点,向右走的次数不能比向上走的少,有多少种路径?

答:从(0,0)出发到达(n,n),需要2n步,其中n次向右,n次向上。但是此处要求向右走的次数不能比向上走的少,也就是说,合法的路径必不可能超过 y = x 这条线,而不合法的走法必然接触y=x+1 这条线。如下图所示,现有一种不正确的走法与 y = x+1 有了交点,那么我们将交点往右的部分沿 y = x+1 对称,则必然经过(n-1,n+1),且一种不合法的走法,对应唯一一条路径。因此,我们从2n步中选取n+1步向上,即是不合法路径。合法路径有C_{2n}^{n}-C_{2n}^{n+1}种。 

 

题目一:

假设有n对左右括号,请求出合法的排列有多少个?合法是指每一个括号都可以找到与之配对的括号,比如n=1时,()是合法的,但是)(为不合法。

给定一个整数n,请返回所求的合法排列数。保证结果在int范围内。

答:和进出栈问题一模一样,只是把进栈看作左括号,出栈看作右括号。因此同样有C_{2n}^{n}-C_{2n}^{n+1}种合法排列。

题目二:

2n个人排队买票,n个人拿5块钱,n个人拿10块钱,票价是5块钱1张,每个人买一张票,售票员手里没有零钱,问有多少种排队方法让售票员可以顺利卖票。

给定一个整数n,请返回所求的排队方案个数。保证结果在int范围内。

答:同样的,此处要求排到拿10块钱的人(出栈)时,前面至少有5块钱零钱(入栈),答案同样是C_{2n}^{n}-C_{2n}^{n+1}

题目三:

求n个无差别的节点构成的二叉树有多少种不同的结构?

给定一个整数n,请返回不同结构的二叉树的个数。保证结果在int范围内。

答:这一题涉及到卡特兰树的另一个形式:如果一个序列满足f_0 = 1, f_1 = 1, f_2 = 2, f_3 = 5, f_n = f_0 * f_{n-1} + f_1 * f_{n-2} + ... + f_{n-1}*f_{0}, n \geqslant 2

则可以化简为:C_{2n}^{n}-C_{2n}^{n+1}

所以,n个结点组成树,可以看作以下过程: 

 

 

因此,有C_{2n}^{n}-C_{2n}^{n+1} 种结构。

题目四:

12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

给定一个偶数n,请返回所求的排列方式个数。保证结果在int范围内。

答:首先我们假定已经将这n个人按从矮到高的顺序排好了序,这样就保证了至少每一排中顺序一定是从矮到高的。然后,对于每一个人,我们可以用1或2对其进行编号,表示它在第一排或第二排。如下面的序列(170-185代表身高):

可以发现,如果要求第一排的人必须比第二排矮,那么每一个前缀和中0的数目不能比1少,否则就会出现下面的问题:

 

因此它又变回了第一题,答案是 C_{2n}^{n}-C_{2n}^{n+1}

 问题五:

有n个信封,包含n封信,现在把信拿出来,再装回去,要求每封信不能装回它原来的信封,问有多少种装法?

答:假设第n封信装入了第i个信封,此时可以分为两种情况

(1)第i封信也装入了第n个信封,此时转化为了剩下的n-2封信装错信封问题;

(2)第i封信没有装入第n个信封,此时可以看作i本属于第n个信封,然后转化为剩下n-1封信装错信封问题。

因此,n封信装错信封,共有f(n) = (n-1)*(f(n-2)*f(n-1))种可能(这里是不用从1开始到n重复计算n次的。因为最终求出的结果是所有信件打乱了放入信封,f(n)其实已经代表了所有的情况)。

如:有{a,b,c}3封信,分别装入{A,B,C}3个信封,假设a错误地装入B中,那么b分为两种情况

(1)b装入A中。此时转化为1封信装错信封问题。由于一封信是可能装错的,因此有f(1) = 0。

(2)b没有装入A中,此时看作b本来就是A中的信,于是转化为了2封信装错信封问题。这种情况下只可能是两封信互相调换位置,所以f(1) = 1。

 所以3封信装错信封,共有f(3) = 2*(f(0)+f(1)) = 2 种可能。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值