首先了解一下卡特兰数:
- 概念:卡特兰数是一种经典的组合数,经常出现在各种计算中,其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...
- 它的应用:参考博客http://lanqi.org/skills/10939/
- 对于进出栈问题,我的理解是:......看了好久看不懂,以后再看吧。先死记硬背!!!
- 总排数:C(n,2n)种
- 不合法排数:C(n+1,2n)种。
- 合法:C(n,2n)-C(n+1,2n)=C(n,2n)/(n+1)种。
2.买票问题,题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1133
就是进出栈问题*m!*n!,因为不同的人买票是不同的。故:
- 总排数:m!×n!×C(m,m+n)种。
- 不合法:m!×n!×C(m+1,m+n) 种。
- 合法:m!×n!×(C(m,m+n)−C(m+1,m+n))= (m+n)!×(m−n+1)/(m+1)种。
-
证明:(这里我也没怎么看得懂)
(1) 对于一个m个0,n个1的不合法序列,设其最小不合法子列为[0,a).,其中有x+1个1, x个0(1和0的个数只相差1由“最小性”保证)。则剩余子列中(n-x-1)个1, (m-x)个0. 将剩余子列翻转,翻转剩余子列有(n-x-1)个0, (m-x)个1. 如此得到的序列1的个数=(x+1) + (m-x)=m+1, 0的个数=(x) + (n-x-1)=n-1.(2) 对于一个m+1个1,n-1个0的序列,必然存在一个从0开始的子列,其中1的个数比0的个数多1。将这个子列作为“不合法子列”(x+1个1, x个0),将剩余子列( (m-x)个1, (n-x-1)个0)翻转得到翻转子列( (m-x)个0, (n-x-1)个1),与“不合法子列”拼接可以得到一个m个0, n个1的序列,由于该序列存在前述“不合法子列”,该序列是不合法的
由此我们证明了任意一个m个0,n个1的不合法序列(m>=n)与一个m+1个1,n-1个0的序列一一对应,因此计算不合法序列个数也就是计算m+1个1,n-1个0的序列个数=C(m+1)(m+n)