给定n, 求不同的BST的数目。
递归应该会超时,动态规划。dp[i]代表节点数为i时,数的种类。
对给定的n, BST的数目应该等于:
左子树节点数为0的种类 * 右子树节点数为n-1的种类 +
左子树节点数为1的种类 * 右子树节点数为n-2的种类 +
...
左子树节点数为n-1的种类 * 右子树节点数为0的种类
注意到左子树节点数为n-1的种类和右子树节点数为n-1的种类是相同的,都为dp[n-1]. (虽然这两种数包含的val并不相等,但它们结构相同,种类数量相同)
代码:
class Solution
{
public:
int numTrees(int n)
{
vector<int> dp(n+1, 0);
dp[0] = 1;
for (int i = 1; i <= n; ++ i)
{
for (int j = 0; j <= i-1; ++ j)
{
dp[i] += (dp[j] * dp[i-1-j]);
}
}
return dp[n];
}
};