用i个点组成高度为不超过j的二叉树的数量。
这时一个dp问题, 我们定义f[i, j]为用i个点组成高度不超过j的二叉树的数量, 那么f[i][j] = sigma(f[k, j-1]*f[i-1-k, j-1]) 1<=k<=i-2; 边界条件是: f[1][j]=1;
代码如下:
/* ID: m1500293 LANG: C++ PROG: nocows */ #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; int N, K; //N个结点 K层 int f[500][500]; //i个结点 组成不超过j层的个数 int mod = 9901; int main() { freopen("nocows.in", "r", stdin); freopen("nocows.out", "w", stdout); cin>>N>>K; for(int j=1; j<=K; j++) f[1][j] = 1; //初始化 for(int j=1; j<=K; j++) //第j层 { for(int i=1; i<=N; i++) { for(int k=1; k<=i-2; k++) f[i][j] = ((f[i][j]+f[k][j-1]*f[i-1-k][j-1]%mod) + mod)%mod; } } int ans = f[N][K]-f[N][K-1]; ans = (ans%mod+mod)%mod; cout<<ans<<endl; return 0; }