zoukankan      html  css  js  c++  java
  • 卡塔兰数(Catalan)

    卡塔兰数(Catalan)


    原理:

    令h(0)=1,h(1)=1。

    卡塔兰数满足递推式:h(n)=h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0)(n>=2)

    比如:

    h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2

    h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5


    另类递推式:h(n)=h(n-1)*(4*n-2)/(n+1);

    递推关系的解为:
    h(n)=c(2n,n)/(n+1) (n=0,1,2,...)  

    h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)

    (注:c(2n,n)=(2n)!/[((n!)*(2n-n)!)] )


    算法实现1:

    //函数功能: 计算Catalan的第n项  
    //函数參数: n为项数  
    //返回值:   第n个Catalan数  
    int Catalan(int n)  
    {  
        if(n <= 1)  
            return 1;  
      
        h[0] = h[1] = 1;        //h(0)和h(1)  
        for(int i = 2; i <= n; i++)    //依次计算h(2),h(3)...h(n)  
        {  
            h[i]=0;  
            for(int j=0;j<i;j++) //依据递归式计算 h(i)= h(0)*h(i-1)+h(1)*h(i-2) + ... + h(i-1)h(0)  
              h[i]+=(h[j]*h[i-1-j]);  
        }  
        int result = h[n]; //保存结果   
        return result;  
    }  


    算法实现2:
    #include<stdio.h>
    #include<iostream>
    using namespace std;
    int main ()
    {
    	int i,j,n;
    	__int64 a[40][40];
    	while(~scanf("%d",&n)&&n!=-1)
    	{  	
    	  memset(a,0,sizeof(a));
    	  for(j=0;j<=n;j++)
    	       a[0][j]=1; 
    		
    	  for(i=1;i<=n;i++)
    	    for(j=i;j<=n;j++)
    		a[i][j]=a[i-1][j]+a[i][j-1];
    	printf("%I64d
    ",a[n][n]);
    	}
    	return 0;
    }
    
    



  • 相关阅读:
    vue项目中使用axios上传图片等文件
    es6入门set和map
    自定义组件实现双向数据绑定
    vue watch详细用法
    bind,call,applay的区别
    前端路由两种模式:hash、history
    jsonp封装成promise
    正则元字符理解2
    webpack配置
    vuex的几个细节
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7115227.html
Copyright © 2011-2022 走看看