一起来数二叉树吧

链接:https://ac.nowcoder.com/acm/problem/13593
来源:牛客网

题目描述

某一天,Zzq正在上数据结构课。老师在讲台上面讲着二叉树,zzq在下面发着呆。
突然zzq想到一个问题:对于一个n个节点,m个叶子的二叉树,有多少种形态呐?你能告诉他吗?
对于第一组样例的解释


输入描述:

每一组输入一行,两个正整数n,m(n<=50)意义如题目

输出描述:

每一行输出一个数,表示相应询问的答案取模1000000007
示例1

输入

复制
4 2
10 5

输出

复制
6
252

备注:

a取模b等于a%b,即a除以b的余数

看到本题应该很快的想到不同的二叉树,所以根据不同构的二叉树性质将其拆分成左子树和右子树的节点和叶节点.(离散学的不是很好,看了题解然后二刷后再写的)

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 const int mod = 1000000007;
 6 long long dp[55][55] = {0};        //dp[n][[m]n代表左子树的节点,m代表左子树的叶节点
 7 int main()
 8 {
 9     int n, m;
10     dp[0][0] = 1; dp[1][1] = 1;
11     for(int i=1;i<51;i++)
12         for(int j=1;j<51;j++)
13             for(int x=0;x<=i-1;x++)
14                 for (int y = 0; y <= x; y++)
15                 {
16                     if (y > j || i - x - 1 < 0) continue;
17                     dp[i][j] = (dp[i][j] + (dp[x][y] % mod)*(dp[i - 1 - x][j - y] % mod) % mod)%mod;
18                 }
19     while (~scanf("%d%d", &n, &m))
20     {
21         printf("%lld\n", dp[n][m]);
22     }
23     
24 }

不足:还得多练习动态规划才行,目前动态规划的水平实在太差了

原文地址:https://www.cnblogs.com/pppyyyzzz/p/11665759.html