2016.10.14
【题目描述】
1214.Catalan数
时限:100ms 内存限制:10000K 总时限:1000ms
描述
令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),这是n阶递推关系。
输入
一个整数N,0≤N<20
输出
给出Catalan数列中第N个数的大小并换行
输入样例
8
输出样例
1430
【解题思路】
按题意要求做就好
【代码实现】
# include <stdio.h>
int a[25];
int catalan(int );
int main(void)
{
int n;
scanf("%d", &n);
printf("%d\n", catalan(n));
return 0;
}
int catalan(int n)
{
int i, j;
int ans;
if (n == 0 || n == 1)
return 1;
else
{
if (a[n])
return a[n];
ans = 0;
for (i = 0; i <= n-1; ++i)
ans += catalan(i)*catalan(n-i-1);
return (a[n] = ans);
}
}
【心得体会】
Catalan数一般可用于三类应用:
1.矩阵链乘: P=a1a2a3…an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n-1)种)
2.一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?(h(n))
3.将一个凸多边形区域分成三角形区域的方法数。(h(n-2)种)