Codeforces_9D-How many trees?
[cpp]
/**题目大意:给定1~n各节点,建立二叉搜索树,求树的深度大于等于h的个数
*本题纠结一天未果,最后根据某大牛的思路写来了。
*状态转移方程: dp[n][h] = sum{dp[i][h-1] * dp[n-i-1][h-1]};
*其中: n为数的节点数, h数的深度, dp[n][h]为以n个节点建立的深度不大于
*h的树的个数; i为左子树的节点数, n-i-1为右子树的节点数, 左子树的
*总数乘以右子树的总数即为该二叉树的总数。 www.zzzyk.com
*初始状态: dp[i][0] = 0; dp[0][i] = 1; (0<=i<n)
*打表求出所有解,然后dp[n][n] - dp[n][h-1] 即为深度大于h的个数
* (不大于n的减去不大于h-1)
*/
#include <cstdio>
using namespace std;
#define MAX 36
long long dp[MAX][MAX];
void binary_search_tree(){
for(int h = 1; h < MAX; h ++){
dp[0][h-1] = 1;
for(int n = 1; n < MAX; n ++){
for(int i= 0; i < n; i ++){
dp[n][h] += dp[i][h-1] * dp[n-i-1][h-1];
}
}
}
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
binary_search_tree();
int n, h;
while( ~scanf("%d %d", &n, &h) ){
printf("%lld\n", dp[n][n] - dp[n][h-1]);
}
return 0;
}
补充:软件开发 , C++ ,