• hdu 1131 Count the Trees


    hdu 1131 Count the Trees

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

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

    卡特兰数的一个应用:

    给顶节点组成二叉树的问题。

      给定N个节点,能构成多少种不同的二叉树?

      (能构成h(N)个)

    但因为每一个节点都被命名了,也就是每一个节点都当做 是不同的,所以最后每一个卡特兰数都要乘以n!

    用组合公式化简得:h(n)=(2n)!/(n+1)! = 2n*(2n-1)* …… *(n+2)。

    #include<iostream>
    using namespace std;
    #define MAX 100
    int f[101][100];
    inline void multiply(int a[],int Max,int b) //大数乘法,注意参数的传递
    {
        int i,s=0;
        for (i = Max-1; i >= 0; i--)   
        {
            s += b * a[i];
            a[i] = s % 10000; // 数组每一位存放大数的四位数字
            s /= 10000;   
        }
    }
    void init()
    {
    	memset(f[1],0,MAX*sizeof(int));
    	f[1][MAX-1]=1;
    	for(int i=2;i<=100;i++)
    	{
    		f[i][MAX-1]=1;
    		for(int j=i*2;j>=i+2;j--)
    			multiply(f[i],MAX,j);
    	}
    }
    int main()
    {
    	int n,i;
    	init();
    	while(cin>>n,n)
    	{
    		for (i = 0; i < MAX && f[n][i] == 0; i++); //去掉数组前为0的数字。
            cout << f[n][i++];             //输出第一个非0数
            for (; i < MAX; i++)   
            { 
    			printf("%04d",f[n][i]);       //输出后面的数,并每位都保持4位长度!(32767)
    		}
            cout << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    一线架构师实践指南读后感
    可修改性战术
    软件架构师如何工作?
    寒假学习第十五天
    寒假学习第十四天
    寒假学习第十三天
    寒假学习第十二天
    寒假学习第十一天
    寒假学习第十天
    如何变得聪明
  • 原文地址:https://www.cnblogs.com/nanke/p/2172059.html
Copyright © 2020-2023  润新知