树的形态
某一天,Zzq正在上数据结构课。老师在讲台上面讲着二叉树,zzq在下面发着呆。
突然zzq想到一个问题:对于一个n个节点,m个叶子的二叉树,有多少种形态呐?你能告诉他吗?
对于第一组样例(4,2)的解释
思路:我们可以假设左子树有x个节点,y个叶子节点,那么右子树就有n-x-1个节点,m-y-1的叶子节点。
那么我们只要找到左子树的形态数目和右字数的形态数目,然后相乘就可以得到结果了。
#include<iostream>
using namespace std;
const int mod = 1e9+7;
typedef long long LL;
LL dp[55][55];
int main(void){
dp[0][0]=1;
dp[1][1]=1;
for(int i=1;i<=50;i++){
for(int j=1;j<=i;j++){
for(int x=0;x<i;x++)
for(int y=0;y<=j;y++)
dp[i][j]=(dp[i][j]+dp[x][y]*dp[i-x-1][j-y]%mod)%mod;
}
}
int n,m;
while(cin>>n>>m)
cout<<dp[n][m]<<endl;
return 0;
}