#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#define maxn 0x7fffffff
using namespace std;
int f[23][23][23]; //节点数为i,叶子数为j,高度为k的平衡二叉树的个数。
void solve(){
// memset(f,0,sizeof(f));
for(int i=0;i<=20;i++){
for(int j=0;j<=20;j++){
for(int k=0;k<=6;k++){
int& t=f[i][j][k];
if(i==0||k==0)
t=(i==0)&&(j==0)&&(k==0);
else if(i==1||k==1)
t=(i==1)&&(j==1)&&(k==1);
else{
for(int lx=0;lx<=i-1;lx++){
for(int ly=0;ly<=min(lx,j);ly++){
t+=f[lx][ly][k-1]*f[i-lx-1][j-ly][k-1];
t+=f[lx][ly][k-2]*f[i-lx-1][j-ly][k-1];
t+=f[lx][ly][k-1]*f[i-lx-1][j-ly][k-2];
}
}
}
}
}
}
}
int main()
{
solve();
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
int sum=0;
for(int i=1;i<=6;i++){
sum+=f[n][m][i];
}
printf("%d\n",sum);
}
return 0;
}
ZOJ 1470 (平衡二叉树)
最新推荐文章于 2020-04-21 16:31:35 发布