【题目链接】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. 注意map<> 的[]

    其实在之前一篇关于map的基本操作中已经提到过注意[]操作,这里再强调一下. 先看下面的程序: #include<iostream> #include<map> using n ...

  2. A*寻路初探 GameDev.net 转载

    A*寻路初探 GameDev.net 译者序:很久以前就知道了A*算法,但是从未认真读过相关的文章,也没有看过代码,只是脑子里有个模糊的概念.这次决定从头开始,研究一下这个被人推崇备至的简单方法,作为 ...

  3. HDU 5384 Danganronpa (Trie树)

    题意:给出两个集合S和T,集合中每个元素是个字符串,而T集合中任一元素都是个子弹,可以打S中的任一怪物,如果子弹是怪物的子串,那么才有伤害值1,若在怪物中出现多次,次数为该子弹打到该怪物的伤害值.每个 ...

  4. marginCollapse之兄弟关系的DIV

    废话不说,直接上图 基本代码如下: 效果图如下: 给两个div分别加marginBottom和marginTop看一下效果 实际效果如下: 我们可以看出两个div之间的距离并不是50+50,而是只显示 ...

  5. HDU 4766 Network

    题意   就是找到一个 位置 使得路由器可以覆盖所有英雄    可以不覆盖主人自己, 找到距离 主人房子最近的位置,距离为多少 没想到  其实是道水题啊!!  分三个情况讨论 第一个情况    如果 ...

  6. CentOS 安装BitTorrent Sync详细步骤

    官网:https://www.getsync.com 这个软件安装完后通过网页浏览器设置共享目录并生成同步Secret,异地的客户端可以通过这个同步Secret访问共的目录,其中有读写和只读两种同步方 ...

  7. OpenLayers调用ArcGIS Server发布的WFS服务

    OpenLayers调用ArcGIS Server发布的WFS服务 原创: 蔡建良 2013-08-20 一. 开发环境 1) Openlayers2.13+arcgis server9.3 2) W ...

  8. 小结JS中的OOP(中)

    此篇文章主要是提炼<JavaScript高级程序设计>中第六章的一些内容. 一:JS中OOP相关的概念 开始之前先总结JS中OOP相关的一些概念: 构造函数:JS中的构造函数就是普通的函数 ...

  9. myeclipse10添加jQuery自动提示

    首先先要在装上spket插件,这个网上有好多教程,我就不详细说了,主要说一下后面的设置,因为我发现我按照网上的装完也设置完没办法使用自动提示功能,以下是我根据前辈的经验然后自己摸索出来的: 选中所建的 ...

  10. C# DataGridView的初始化

    动态添加列和行 方法一 通过手动添加Datatable,再绑定dataGridView DataTable dt = new DataTable();//建立个数据表 dt.Columns.Add(n ...