hdu1134(卡特兰数总结)

1.括号化问题。

  矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)

  2.出栈次序问题。

  一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?

  类似:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只        要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

  3.将多边行划分为三角形问题。

  将一个凸多边形区域分成三角形区域的方法数?

  类似:一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她

  从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

  类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?( h(n) )

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

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




这个为电影票的代码,有点特殊,m为有50元的人,n为100元

#include <iostream>

#include <string>

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 fact[205][MAX];

void setFact ()  //求出0-200的阶乘值

{

    fact[0][MAX-1] = fact[1][MAX-1] = 1;

    for ( int i = 2; i <= 200; ++ i )

    {

        memcpy ( fact[i] , fact[i-1] , MAX * sizeof ( int ) );

        multiply ( fact[i] , MAX , i );

    }

}

void outPut ( int ctl[MAX] )

{

    int i = 0;

    while ( i < MAX && ctl[i] == 0 )//去掉前面的为0的项

    {

        i ++ ;

    }

    printf ( "%d", ctl[i++] );

    while ( i < MAX )

    {

        printf ( "%04d", ctl[i++] );

    }

    putchar ( '\n' );

}

int res[MAX];

int main ()

{

    int M,N;

    int ca = 1;

    setFact();  //打表

    while ( cin >> M >> N , M + N )

    {

        printf ( "Test #%d:\n",ca++ );

        if ( N > M )

        {

            puts ( "0" );

            continue;

        }

        memcpy ( res , fact[M+N] , MAX * sizeof ( int ) ); //阶乘 ( m + n )!

        multiply ( res, MAX, M - N + 1 );    // ( m + n )! * ( m-n+1 )

        divide ( res, MAX, M + 1 );   // ( m + n )! * ( m-n+1 )  / ( m+ 1 )

        outPut ( res );

    }

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值