在力扣上说的很明白了,很有意思的推导:
首先,设F(i,n)表示n长度的序列中以i为根节点划分的二叉搜索树的个数,G(n)表示长度n的序列的二叉搜索树的个数,明显有:
而很明显,F(i, n)的个数其实是可以由两边子树的G求得的,如下所示:
然后就推导出了G的递推表达:
代码如下所示:
- #include<bits/stdc++.h>
- using namespace std;
- int main(){
- int n;
- cin>>n;
- vector<int> G(n+1);
- G[0]=G[1]=1;
- for(int i=2;i<=n;++i){
- for(int j=0;j<=i;++j){
- G[i]+=G[j-1]*G[i-j];
- }
- }
- cout<<G[n];
- return 0;
- }