卡特兰数

一道经典卡特兰数列题

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<bits/stdc++.h>
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优化

#include<bits/stdc++.h>
using namespace std;
int numStack(int n, int m) {
    if (n == 0) return 1;
    if (m == 0) return numStack(n - 1, 1);
    return numStack(n - 1, m + 1) + numStack(n, m - 1);
}
int main() {
    for (int i = 1; i <= 10; i++) {
        cout << "F(" << i << ")=" << numStack(i, 0) << endl;
    }
}

 

posted @ 2022-06-20 17:35  风乐  阅读(31)  评论(0编辑  收藏  举报