注解
1、Catalan数的应用(类似于hdu1023,hdu1130)。Catalan(n)=\sum{Catalan(k-1)Catalan(n-k)},k=1,2,…,n
2、常见的Catalan数应用:n个数组成的栈的出栈序列个数Catalan(n);n个-1和n个1组成的字符串,2n位的和大于等于0的个数Catalan(2n);n*n的格子,只在上(下)对角线走,走到(n,n)的走法数目Catalan(n)
3、Catalan数也有其他形式的表示:
如用组合数表示:
Catalan(n)=Combination(2n, n) - Combination(2n, n-1)
Catalan(n)=Combination(2n, n) / (n+1)
如用递推式表示:
Catalan(n)=Catalan(n-1) *(4n-2) / (n+1)
4、本题的模型是:n个药片,每个药片可以掰成两半。每天吃半片(可能是掰开的,也可能是整个的),问n个药片吃完,有多少种情况?
5、与本题类似的模型:有N个红球,N个白球,问这2N个小球的排列数,且从第一个球到后面任意个球中红球的个数必须不小于白球的个数(理解为白球是红球产生的,一个红球产生一个白球)。
代码
#include <iostream>
#include <cstring>
using namespace std;
typedef long long int LL;
const int maxn = 30;
LL a[maxn+1];
void init(){
memset(a, 0, sizeof(a));
a[0] = 1;
a[1] = 1;
for(int i=2; i<=maxn; i++){
for(int j=0; j<i; j++){
a[i] += a[j]*a[i-j-1];
}
}
}
int main() {
init();
int n;
cin>>n;
while(n){
cout<<a[n]<<endl;
cin>>n;
}
return 0;
}