HDU ACM 1134 Game of Connections / 1130 How Many Trees?(卡特兰数)
【题目链接】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?(卡特兰数)的更多相关文章
- hdu 1130How Many Trees?(卡特兰数)
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列. 以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为(从第零 ...
- HDU 1134 Game of Connections(卡特兰数+大数模板)
题目代号:HDU 1134 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1134 Game of Connections Time Limit: 20 ...
- hdu 1134 Game of Connections
主要考察卡特兰数,大数乘法,除法…… 链接http://acm.hdu.edu.cn/showproblem.php?pid=1134 #include<iostream>#include ...
- HDU——1134 Game of Connections
Game of Connections Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- HDU——1130 How Many Trees?
How Many Trees? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 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 ...
- hdu 1130,hdu 1131(卡特兰数,大数)
How Many Trees? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- HDU 6084 寻找母串(卡特兰数)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6084 [题目大意] 对于一个串S,当它同时满足如下条件时,它就是一个01偏串: 1.只由0和1两种 ...
- HDU 5673 Robot【卡特兰数】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5673 题意: 有一个机器人位于坐标原点上.每秒钟机器人都可以向右移到一个单位距离,或者在原地不动.如 ...
随机推荐
- HDU 4655 Cut Pieces(数学分析题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4655 题意:给出n个石子,第i个石子可以染ai种颜色.对于每种颜色,比如颜色1221,我们称有3段.连 ...
- [HDOJ2830]Matrix Swapping II(胡搞)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2830 给一个矩阵只有0和1,矩阵的列可以和其他列交换无数次,问交换后整个矩阵形成的最大的全是1的子矩阵 ...
- linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用
---操作环境--- 虚拟机版本:VMware Workstation_10.0.3 Linux系统版本:CentOS_6.5(64位) 物理机系统版本:win10 一.虚拟网络三种连接方式 当在V ...
- 《OD大数据实战》HBase环境搭建
一.环境搭建 1. 下载 hbase-0.98.6-cdh5.3.6.tar.gz 2. 解压 tar -zxvf hbase-0.98.6-cdh5.3.6.tar.gz -C /opt/modul ...
- HibernateTools实现pojo类 数据库schma mapping映射的相互转换
核心 利用HibernateTools,从POJO类,Mapping映射文件,数据库表有其中的一项,就能生成其他两项. 概述 在使用Hibernate开发系统持久层时,按照一般开发流程 1.分析业务 ...
- oracle数据导入的常用命令
oracle 中数据库完全导入导出:cmd命令行模式 oracle数据库cmdfile数据库服务器constraints Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.ex ...
- HeadFirst Jsp 06 (会话管理)
现在我们希望能够跨多个请求保留客户特定的状态. 现在, 模型中的业务只是检查请求中的参数, 并返回一个响应(建议), 应用中没有谁记得在当前请求之前与这个客户之间发生过什么. 与一个客户的整个会话期间 ...
- Mobile Assistant
闲来无事,分享一个小东西--手机小助手,历时两周,这里选择几个不错的界面以示效果! 如果有感兴趣的部分,欢迎随时交流!
- java中进程与线程的三种实现方式
一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程是指 ...
- Uva 10382 (区间覆盖) Watering Grass
和 Uva 10020几乎是一样的,不过这里要把圆形区域转化为能够覆盖的长条形区域(一个小小的勾股定理) 学习一下别人的代码,练习使用STL的vector容器 这里有个小技巧,用一个微小量EPS来弥补 ...