题目
传送门:QWQ
分析
用$ dp[i][j] $表示用i个节点,有多少深度小于等于j的二叉树。
答案是$ dp[n][n] - dp[n][h-1] $
转移时枚举左子树的节点数量,就可以知道右子树的节点数量。不断相乘加到$ dp[i][j] $上。
代码
1 #include <bits/stdc++.h> 2 #define debug(a) cerr<<(#a)<<" = "<<a<<endl; 3 #define debug2(a,b) cerr<<(#a)<<" = "<<a<<" "<<(#b)<<" = "<<b<<" "; 4 using namespace std; 5 typedef long long ll; 6 const int maxn=39; 7 ll dp[maxn][maxn]; 8 int main(){ 9 int n,h; 10 scanf("%d%d",&n,&h); 11 for(int i=0;i<=n;i++) dp[0][i]=1; 12 for(int i=1;i<=n;i++){ 13 for(int j=1;j<=n;j++){ 14 ll qa=0; 15 for(int k=0;k<i;k++){ 16 qa+=dp[k][j-1]*dp[i-k-1][j-1]; 17 } 18 dp[i][j]=qa; 19 } 20 } 21 cout<<dp[n][n]-dp[n][h-1]<<endl; 22 return 0; 23 }