卡特兰数


一道经典卡特兰数列题

P1044 [NOIP2003 普及组] 栈

卡特兰数列原理:

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

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

该递推关系的解为:h(n)=c(2n-2,n-1)/n (n=1,2,3,...)

具体的证明过程较为繁琐

洛谷《深入浅出程序设计竞赛》(基础篇)中递推章节利用了求出栈序列的总数量这一问题来进行证明

此题题解也有大佬说明

因此得出,栈的出栈序列数量与n的关系符合卡特兰数列

可以得出代码

#include
using namespace std;
int n,f[20];
int main()
{
	f[0]=f[1]=1;
	cin >> n;
	for(int i=2;i<=n;i++)
		for(int j=0;j<=i;j++)
			f[i]+=f[j]*f[i-j-1];
	cout << f[n] << endl;
	return 0;
}

此题也能用记搜,dp写法,这里不再描述