BUAA OJ 749 DH的二叉搜索树

来源:互联网 发布:福州云顶网络智联 编辑:程序博客网 时间:2024/06/17 20:59

题目描述

DH喜欢树,但更喜欢一些特殊的树,因为它们长得好看,今天他想来跟大家聊一聊二叉搜索树,什么叫二叉搜索树,首先它是一棵二叉树,其次,这棵树的每个节点的值都不一样且对于每一个节点它的左子树的任何节点的值都比它的值小,右子树的任何节点的值都比它的值大。现在DH想知道由值为1,2,3,…,n的n个节点组成的二叉搜索树里,高度不小于h的有多少?

输入

多组输入数据,每组输入数据一行,包含两个数n(1≤n≤35),h(1≤h≤n)

输出

每组数据输出一行,为该组数据对应的答案

输入样例

1 1

输出样例

1

解题思路

一个二叉搜索树可以看作根节点和它的左右子树构成的。
而所有节点都是互异的。
所以所有二叉搜索树的个数就是卡特兰数。

高度不小于h的所有二叉树的个数可以用二维的动态规划解决
在上一个问题的基础上,添加一维为树的高度。

树的高度=max(左子树的高度,右子树的高度)+1。

AC代码

#include <stdio.h>typedef  long long ll;ll a[36][36];int main(){    a[0][0]=a[1][1]=1;    for(int i=2;i<36;i++)        for(int j=0;j<i;j++)            for(int k=0;k<=j;k++)                for(int l=0;l<i-j;l++)                    a[i][(k>l?k:l)+1]+=a[j][k]*a[i-j-1][l];    int n,h;    ll cnt;    while(~scanf("%d%d",&n,&h)){        cnt=0;        for(int i=h;i<36;i++)            cnt+=a[n][i];        printf("%lld\n",cnt);    }}
原创粉丝点击