卡特兰数一般公式

  令h(0)=1,h(1)=1,catalan数满足递推式。h(n) = h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)。也就是说,如果能把公式化成上面这种形式的数,就是卡特兰数

组合公式

  Cn = C(2n,n) / (n+1)

  (化简前 h(n) = c(2n,n)-c(2n,n+1) (n=0,1,2,...) 证明)

递归公式1

  h(n) = h(n-1)*(4*n-2) / (n+1)

递归公式2

  h(n) = ∑(i=0 to n-1) h(i)*h(n-i-1)

 

二.资料

  catalan---卡特兰数(小结)

 

三.某些题

1.在圆上选择2n个等间隔的点。证明将这些点成对连接起来使得所得到的n条线段不相交的方法数等于第n个Catalan数

设方法数为gn,分别将这些点用1,2,…,2n标记。取定点1,任选另一个偶数点2k,连接点1与点2k。该线段将圆分成K1和K2两部分。对K1,有k-1对点,故有gk-1种方法;对K2,有n-k对点,故有gn-k种方法。所以
   g0=1
   令hn=gn-1,则
   hn+1=h1hn+h2hn-1+…+hnh1  h1=1

   所以gn=g0 gn-1 + g1 gn-1 +...+ gn-1 g0

   即 gn=Cn

2.二叉树计数:一个有n个结点的二叉树总共有多少种形态

 1 //设当前根节点为k,方案数为h[k],左子树有k-1个节点,右子树有n-k个节点 
 2 //则 h[k]=h[k-1]*h[n-k](k=1 to n) 
 3 //Ans= h[0]h[n-1] + h[1]h[n-2] +...+ h[n-1][0]
 4 //即卡特兰数 
 5 #include<cstdio>
 6 #include<cctype>
 7 using namespace std;
 8 const int N=22;
 9 
10 int n;
11 long long H[N];
12 
13 int read()
14 {
15     int now=0;bool f=0;char c=getchar();
16     for(;!isdigit(c);c=getchar())
17       if(c=='-') f=1;
18     for(;isdigit(c);c=getchar())
19       now=(now<<3)+(now<<1)+c-'0';
20     return f?-now:now;
21 }
22 
23 int main()
24 {
25     n=read();
26     H[0]=1;
27     for(int i=1;i<=n;++i)
28       H[i]=H[i-1]*(4*i-2)/(i+1);
29     printf("%lld",H[n]);
30     return 0;
31 }
View Code

相关文章:

  • 2021-10-20
  • 2021-06-13
  • 2021-07-07
  • 2022-02-13
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-04
  • 2021-04-06
  • 2021-12-30
  • 2021-07-06
  • 2021-11-05
  • 2021-11-14
相关资源
相似解决方案