HDU1131_卡特兰数算二叉树个数

题目大意: 给你n个节点,然后求出能够组成的二叉树的个数,注意每个节点都有标号。 解题思路: 卡特兰数,然后每个节点都有标号,所以最后要再对节点全排列,即n! 先预处理105以内的卡特兰数,之后再乘上n! 卡特兰数的递推公式:h(n)=h(n-1)*(4*n-2)/(n+1);   h(0) = 1; 代码:
//h(n)=h(n-1)*(4*n-2)/(n+1);   h(0) = 1;
#include
using namespace std;
const int MAX_LEN = 10005;
const int MAX_NUM = 105;

int catalan[MAX_NUM][MAX_LEN];

void multip(int *ans, int b, int &len)
{
    int carry = 0;
    for(int i = 0; i < len; i++)
    {
        int temp = ans[i] * b + carry;
        ans[i] = temp % 10;
        carry = temp / 10;
    }
    while(carry)
    {
        len++;
        ans[len-1] = carry % 10;
        carry /= 10;
    }
    return ;
}

void division(int *cata, int b, int &len)
{
    int r = 0;
    for(int i = len - 1; i >= 0; i--)
    {
        int temp = cata[i] + r * 10;
        cata[i] = temp / b;
        r = temp % b;
    }
    while(!cata[len-1])
        len--;
    return ;
}

int main(void)
{
    int len[MAX_NUM];
    memset(catalan, 0, sizeof(catalan));
    memset(len, 0, sizeof(len));
    catalan[0][0] = 1;
    len[0] = 1;

    for(int i = 1; i < MAX_NUM; i++)
    {
        memcpy(catalan[i], catalan[i-1], sizeof(catalan[i-1]));
        len[i] = len[i-1];

        multip(catalan[i], 4 * i - 2, len[i]);
        division(catalan[i], i + 1, len[i]);
    }


    int n;
    while(scanf("%d", &n), n)
    {
        for(int i = 1; i <= n; i++)
            multip(catalan[n], i, len[n]);

        for(int j = len[n] - 1; j >= 0; j--)
        {
            printf("%d", catalan[n][j]);
        }
        printf("\n");

    }
    return 0;
}

转载于:https://www.cnblogs.com/cchun/archive/2012/02/15/2520232.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值