Codeforces_9D-How many trees?

来源:岁月联盟 编辑:猪蛋儿 时间:2012-11-16

[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.2cto.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;