您的位置:首页 > 其它

Codeforces_9D-How many trees?

2012-11-16 02:06 363 查看
/**题目大意:给定1~n各节点,建立二叉搜索树,求树的深度大于等于h的个数
*本题纠结一天未果,最后根据某大牛的思路写来了。
*状态转移方程:   dp
[h] = sum{dp[i][h-1] * dp[n-i-1][h-1]};
*其中: n为数的节点数, h数的深度, dp
[h]为以n个节点建立的深度不大于
*h的树的个数;   i为左子树的节点数, n-i-1为右子树的节点数, 左子树的
*总数乘以右子树的总数即为该二叉树的总数。
*初始状态: dp[i][0] = 0;  dp[0][i] = 1; (0<=i<n)
*打表求出所有解,然后dp

- dp
[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
[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

- dp
[h-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: