【题目链接】http://acm.hdu.edu.cn/showproblem.php?pid=1134

【解题背景】这题不会做,自己推公式推了一段时间,将n=3和n=4的情况列出来了,只发现第n项与第n-1项有关系,上网搜索的时候发现是组合数学中关于Catalan(卡特兰)数的运用.

以下资料来自网络,整理以备记录学习:

【来源链接】

http://baike.baidu.com/view/2499752.htm

http://blog.163.com/lz_666888/blog/static/1147857262009914112922803/

Catalan序列是一个整数序列,其通项公式是   我们从中取出的Cn就叫做第 n 个 Catalan 数,前17个 Catalan 数分别是:

1,  1,  2,  5,  14,  42,  132,  429,  1430,  4862,  16796,  58786,  208012,  742900,  2674440,  9694845,  35357670

令h(0) = 1,h(1) = 1,catalan 数满足递推式:

h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)

另类递归式:

h(n)=((4*n-2)/(n+1))*h(n-1);

该递推关系的解为:

h(n+1)=C(2n,n)/(n+1) (n=1,2,3,...)

Catalan序列主要有几类运用:

1.括号化问题:

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

2.出栈次序问题:

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

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

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

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

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

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

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

(能构成h(n)个,这个公式的下标是从h(0)=1开始的)

 【随笔:本来知道这个公式之后想打表打出100个Catalan数,将公式化简了一下且用代码尝试了一下:

         if(n ==  || n == ){
printf("1\n");
continue;
}
int sum = ;
for(int t=*n-; t>n+; t-=)
sum *= t;
//func(int m)函数求m的阶乘,func_pow(int a, int b) 函数求a的b次方
printf("%d\n", sum*func_pow(, n/)/func(n/+n%));

后来发现这也是大数处理的问题,翻看之前自己写的大数相乘大数相除的代码,发现写的很吃力,干脆上网找大数处理的若干代码,发现可以很简单的进行大数相乘及大数相除,即为现在的Ac源代码中的大数处理

源码来自:http://blog.163.com/lz_666888/blog/static/1147857262009914112922803/

 #include<iostream>
#define MAX 100
#define BASE 10000 using namespace std; void multiply(int a[],int Max,int b) //大数乘法,注意参数的传递
{
int i,array=;
for (i = Max-; i >= ; i--)
{
array += b * a[i];
a[i] = array % BASE; // 数组每一位存放大数的四位数字
array /= BASE;
}
return;
} void divide(int a[], int Max, int b) //模拟大数除法
{
int i, div = ;
for (i = ; i < Max; i++)
{
div = div * BASE + a[i];
a[i] = div / b;
div %= b;
}
}
int main()
{
int a[][MAX],i, n;
memset(a[],,MAX*sizeof(int));
for (i=, a[][MAX-] = ; i < ; i++) // 高坐标存放大数低位
{
memcpy(a[i], a[i-], MAX * sizeof(int)); //h[i] = h[i-1];
multiply(a[i], MAX, * i - ); //h[i] *= (4*i-2);
divide(a[i], MAX, i + ); //h[i] /= (i+1);
}
while (cin >> n && n != -)
{
for (i = ; i < MAX && a[n][i] == ; i++); //去掉数组前为0的数字。
cout << a[n][i++]; //输出第一个非0数
for (; i < MAX; i++)
{
printf("%04d",a[n][i]); //输出后面的数,并每位都保持4位长度!(32767)
}
cout << endl;
}
return ;
}

HDU ACM 1134 Game of Connections / 1130 How Many Trees?(卡特兰数)的更多相关文章

  1. hdu 1130How Many Trees?(卡特兰数)

    卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列. 以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为(从第零 ...

  2. HDU 1134 Game of Connections(卡特兰数+大数模板)

    题目代号:HDU 1134 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1134 Game of Connections Time Limit: 20 ...

  3. hdu 1134 Game of Connections

    主要考察卡特兰数,大数乘法,除法…… 链接http://acm.hdu.edu.cn/showproblem.php?pid=1134 #include<iostream>#include ...

  4. HDU——1134 Game of Connections

    Game of Connections Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  5. HDU——1130 How Many Trees?

    How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. hdu acm 1028 数字拆分Ignatius and the Princess III

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  7. hdu 1130,hdu 1131(卡特兰数,大数)

    How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. HDU 6084 寻找母串(卡特兰数)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6084 [题目大意] 对于一个串S,当它同时满足如下条件时,它就是一个01偏串: 1.只由0和1两种 ...

  9. HDU 5673 Robot【卡特兰数】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5673 题意: 有一个机器人位于坐标原点上.每秒钟机器人都可以向右移到一个单位距离,或者在原地不动.如 ...

随机推荐

  1. SQLServer2008 行转列2

    with a as ( select numb,name,row_number() over( partition by numb order by name desc) rowid from fen ...

  2. html5 移动端单页面布局

    序     移动端的web网页使用的是响应式设计,但一般我们看到的网站页面都是跳转刷新得到的,比如通过点击一个menu后进入到另一个页面 今天来说下是移动端的单页面的布局.单页面就是一切操作和布局都是 ...

  3. SPOJ 1739 Yet Another Equation(Pell方程)

    题目链接:http://www.spoj.com/problems/EQU2/ 题意:给出方程x^2-n*y^2=1的最小整数解. 思路:参见金斌大牛的论文<欧几里得算法的应用>. imp ...

  4. windows主机无法访问服务器

    在CentOS下安装配置hadoop的时候,总显示因为网络端口而导致主机无法访问服务器,遂打算先关闭一下防火墙. 偶然看到防火墙的配置操作说明,感觉不错.执行”setup”命令启动文字模式配置实用程序 ...

  5. JS通用方法总结(一)

    /** * id数组转换为json字符串 */ function arrayTojson(arr) { var jsonIds = "["; for ( var i = 0; i ...

  6. Android中的PopupWindow详解

      Android的对话框有两种:PopupWindow和AlertDialog.它们的不同点在于: AlertDialog的位置固定,而PopupWindow的位置可以随意 AlertDialog是 ...

  7. (转载)NSTimer

    转自:http://www.cnblogs.com/smileEvday/archive/2012/12/21/NSTimer.html 看到这个标题,你可能会想NSTimer不就是计时器吗,谁不会用 ...

  8. 13.Object-C--浅谈Foundation框架常用的结构体

    ------- android培训.iOS培训.期待与您交流! ---------- 昨天学习了Foundation框架中常用的结构体,下面我简单的总结一下,如果错误麻烦请留言指正,谢谢! Found ...

  9. jquerymobile使用技巧

    1)ajax开关(默认jquery以ajax方式加载页面) $.mobile.ajaxEnabled = false; 2)不编译指定标签 $.mobile.page.prototype.option ...

  10. mysqldump备份数据库时排除某些库

    说明:使用mysqldump –all-databases会导出所有库.但如果做主从,从主库dump出数据时,我们是不需要也不想要information_schema 和 mysql 库的.数据库少的 ...