AcWing 1645. 不同的二叉搜索树
原题链接
中等
作者:
minux
,
2020-04-24 19:12:49
,
所有人可见
,
阅读 840
解法1:动态规划
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1005;
const int P=1e9+7;
LL f[N];
int n;
int main(){
memset(f, 0x00, sizeof f);
// 动态规划求解
// Catanla计数公式 f(x)=\Sum f[j]*f[i-j-1]
cin>>n;
f[0]=1;
for(int i=1; i<=n; ++i){
for(int j=0; j<i; ++j){
f[i]+=(LL)f[j]*f[i-j-1];
f[i]%=P;
}
}
cout<<f[n]%P<<endl;
return 0;
}
解法2:递推公式(大数情况下计算结果与动态规划算法不同, 与MOD计算有关)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int P=1e9+7;
LL f;
int n;
int main(){
cin>>n;
f=1;
for(int i=0; i<n; ++i){
f=((f*2%P)*(2*i+1)%P)/(LL)(i+2);
}
cout<<(int)f%P<<endl;
return 0;
}