思路1 dp

G(n)表示输入n时,能构建多少棵不同的BST。两个特殊情况是n=0和n=1时,空树和一个节点的树都只有一种情况,所以G(0)=1, G(1)=1

F(i, n)表示以i为根结点,n的序列能构建多少棵不同的BST。我们可以得到

G(n) = F(1, n) + F(2, n) + ... + F(n, n)

F(i, n)又可以分成左右子树情况种类的乘积,即

F(i, n) = G(i-1) * G(n-i), 1 <= i <= n

最后可以得到

G(n) = G(0) * G(n-1) + G(1) * G(n-2) + … + G(n-1) * G(0)

最后计算的时候,要从小开始算

Last updated