树的形态

树的形态

某一天,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;

}

树的形态

上一篇:docker安装


下一篇:表单提交刷新页面问题