Hdu1130:二叉搜索树的数目

我的不完整版本:

(只适用非常小的范围内的递归求解)

#include <iostream>

using namespace std;

int num[101];

void Init(int n)

{

         memset(num,0,sizeof(num));

         num[0]=1;

         num[1]=1;

         num[2]=2;

         for(int i=3;i<=n;i++)

                   for(int j=0;j<=i;j++)

                            num[i]+=num[j]*num[i-j-1];

}

int main()

{

         Init(10);

         for(int i=1;i<=10;i++)

                   cout<<num[i]<<endl;    

         return 0;

}

转载某牛牛的版本:

转载版本:

·         Catalan数的解法

Catalan数的组合公式为 Cn=C(2n,n) / (n+1);

此数的递归公式为  h(n ) = h(n-1)*(4*n-2) / (n+1)

 小数解

对于50以下的小数解来说,使用数组就可以完成,代码如下:

#include<iostream>

using namespace std;

int main()

{

     long long  int a[101][101],i,j,n;

    for (i=0; i<101; i++)    //利用数组求 Catalan

        a[i][0] = 1;

    for (i=1; i<101; i++)                    

    {

        for (j=1; j<=i; j++)   

            a[i][j] = a[i][j-1] + a[i-1][j];   

    }

    while (cin>>n)   

    {     

        cout<<a[n][n]<<endl;

    }

    return 0;

}

 大数解

对于大数来说,就应该使用下面的大数算法。

使用的公式为:h(n)  = h(n-1)*(4*n-2)/n+1;

#include<iostream>

using namespace std;

#define MAX 100

#define BASE 10000

void multiply(int a[],int Max,int b)  //大数乘法

{

    int i,array=0;

    for (i=Max-1; i>=0; i--)   

    {

        array+=b*a[i];

        a[i] = array%BASE;

        array /= BASE;   

    }

}

 

void divide(int a[], int Max, int b)  //大数除法

{

    int i,div=0;

    for (i=0;i<Max; i++)   

    {

        div = div*BASE + a[i];

        a[i] = div / b;

        div %= b;

    }

}

int main()

{

    int a[101][MAX],i,j,n;

    memset(a[1],0,MAX*sizeof(int));

    for (i=2,a[1][MAX-1]=1; i<101; i++)

    {

        memcpy(a[i],a[i-1],MAX*sizeof(int));      //h[I] = h[i-1];  

        multiply(a[i],MAX,4*i-2);               //h[i] *= (4*i-2);

        divide(a[i],MAX,i+1);                  //h[i] /= i+1;

    }

    while (cin>>n)   

    {

        for (i=0; i<MAX && a[n][i]==0; i++);  //去掉数组前为0的数字。

        cout<<a[n][i++];             //输出第一个非0

        for (; i<MAX; i++)   

            printf("%04d",a[n][i]);       //输出后面的数,并每位都保持5位长度

        cout<<endl;

    }

    return 0;

}

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值