https://codeforces.com/problemset/problem/9/D
一开始居然还想直接找公式的,想了想还是放弃了。原来这种结构是要动态规划。
状态是知道怎么设了,tnh表示节点数为n个,树高为h的BST的个数。
为什么要这么设状态呢?是考虑到题目关心BST的高度,而且BST具有递归性。
但是这个关键就是要加上n个节点的标记,因为不同节点数量明显可以构造出的高为h的树不同,而且也会影响BST另一侧的构造。
所以说设对状态就做对了一半。
思路就是按高为h的BST是怎么由高为h-1的BST加上根节点转移过来的,重点是向上转移而不是向下转移。
首先你要分类讨论,这个根节点的数字是m,那么左边会有1~m-1共m-1个节点,右边则有n-m个节点,然后分
1.左子树的高是h-1,右子树的高是0~h-1(假如可以放得下的话)。
2.右子树的高是h-1,左子树的高是0~h-2(注意是h-2,否则和上面重复)
左右子树的构造是独立的,所以相乘。两种情况的分类的,所以相加。
最后遍历一遍m得到所有tnh的和。
原文地址:https://www.cnblogs.com/Yinku/p/10287466.html
时间: 2024-11-10 11:20:16