這題我想了很久ios
設 \(f_{i,j}\) 爲 \(i\) 結點 \(<=j\) 的方案數spa
固定根,枚舉左右子樹,就有:code
\[f_{i,j}=\sum_{k=0}^{n-1}f_{k,j-1}*f_{i-k-1,j-1}\]get
初始化 \(f_{0,i}=1\)string
答案 \(ans=f_{n,n}-f_{n,h-1}\)it
Codeio
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #define N 40 #define int long long using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); } return x * f; } int n,h; int f[N][N]; //f[i][j] 表示 i個結點 高度爲j 的方案總數 signed main() { n = read(), h = read(); for(int i=0;i<=n;++i) f[0][i] = 1; for(int j=1;j<=n;++j) for(int i=1;i<=n;++i) for(int k=0;k<i;++k) f[i][j] += f[k][j-1]*f[i-k-1][j-1]; cout<<f[n][n]-f[n][h-1]<<endl; return 0; }