卡特兰数
一道经典卡特兰数列题
卡特兰数列原理:
令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;
}
}