卡特兰数

#include<cstdio>//卡特兰数 + 记忆化搜索
//h(n)=C(2n,n)/(n+1)
//卡特兰数背景:
//1.在圆上有2N个不同的点 N条线段把这些点连接 每个点连一条 使所有的线段都不相交
//2.对凸n+2边形进行不同的三角形分割(只连接顶点对形成n个三角形)数
//3.n个数入栈后的出栈的排列总数
#define mod 100000007
#define ll long long
using namespace std;
int n;
ll f[3003];

ll solve(int x){
if(x==0||x==1) return 1;
if(f[x]) return f[x];
if(f[x]==0){
ll ans=0;
for(int i=1;i<=x;i++){
ans=(ans+solve(i-1)*solve(x-i))%mod;
}
f[x]=ans;
return ans%mod;
}
}

int main(){
scanf("%d",&n);
printf("%lld",solve(n));
return 0;
}

posted @ 2021-03-28 13:08  starlightlmy  阅读(62)  评论(0)    收藏  举报