卡特兰数
/*
建立数组f。f[i]表示i个数的全部可能性。f[0]=1,f[1]=1;
设x为当前出栈序列的最后一个,则x有n种取值
由于x是最后一个出栈的,所以可以将已经出栈的数分成两部分
1.比x小
2.比x大
比x小的数有x-1个,所以这些数全部出栈可能为f[x-1]
解释:因为进栈顺序从小到大排列,在x入栈前,有x-1个数已经出栈
比x大的数有n-x个,所以这些数全部出栈可能为f[n-x]
解释:同理,x将两边的数字分割为两批,比x大的(n-x)个数字有f[n-x]种可能
这两部分互相影响,所以一个x的取值能够得到的所有可能性为f[x-1]f[n-x]
另外,由于x有n个取值,所以
ans = f[0]f[n-1] + f[1]*f[n-2] + ……+f[n-1] * f[0];
第一个数 第二个数 第n个数
*/
include
int n,f[30];
int main(){
//递推实现卡特兰数
scanf("%d",&n);
f[0] = 1,f[1]=1;
for(int i=2;i<=n;i++)
for(int j=0;j<i;j++)
f[i] = f[i] + f[j]f[i-j-1]; //递推公式
/其实原理并没有那么复杂,
看元素1的位置即可,
1在第一个出栈,
第2个出栈。。。。。第n个出栈的序列考虑一下就知道了。*/
printf("%d",f[n]);
return 0;
}

浙公网安备 33010602011771号