Ⅳ.Catalan数
Catalan数首先是由Euler在精确计算对凸n边形的不同的对角三角形剖分的个数问题时得到的,它经常出现在组合计数问题中。
问题的提出:在一个凸n边形中,通过不相交于n边形内部的对角线,把n边形拆分成若干三角形,不同的拆分数目用hn表示,hn即为Catalan数。例如五边形有如下五种拆分方案(图3-14),故h5=5。求对于一个任意的凸n边形相应的hn。
Catalan数是比较复杂的递推关系,尤其在竞赛的时候,选手很难在较短的时间里建立起正确的递推关系。当然,Catalan数类的问题也可以用搜索的方法来完成,但是,搜索的方法与利用递推关系的方法比较起来,不仅效率低,编程复杂度也陡然提高。
//include<AC自动机> #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> int f[100000]; using namespace std; int main() { int n; cin>>n; f[2]=1; f[3]=1; for(int i=4;i<=n;++i) { for(int j=2;j<=n-1;j++) { f[i]=f[j]*f[i-j+1]+f[i]; } } cout<<f[n]; return 0; }