LeetCode Unique Binary Search Trees (DP)
题意:
一棵BST有n个节点,每个节点的key刚好为1~n。问此树有多少种不同形态?
思路:
提示是动态规划。
考虑一颗有n个节点的BST和有n-1个节点的BST。从n-1到n只是增加了一个点n,那么点n可以放的地方并不多,而且有一些规律。由于n是最大的,所以必定是在最右边,但是它的上面和下面也可以有一些点,假设点n的上面有k个点,下面则为n-k-1个。观察到点n的上面的点必定是[1, n-k-1],下面的点是[n-k, n-1],而点数<n的BST的形态数都已经求出,那么枚举这个k值就行了。
1 class Solution { 2 public: 3 int numTrees(int n) 4 { 5 vector<int> que(2,1); 6 for(int i=2; i<=n; i++) 7 { 8 int sum=0; 9 for(int j=0; j<i; j++) 10 sum+=que[j]*que[i-j-1]; 11 que.push_back(sum); 12 } 13 return que[n]; 14 } 15 };