[Leetcode 96][Dynamic Programming]Unique Binary Search Trees

不管一个BST的形状是怎样的,以一个数字作为根,左子树的情况数量由于数字数量固定,这个结果可以重复利用,右子树同理。从1开始枚举每个数字作为根,那么以dp[i]表示前i个数字可以组成的情况数量

[dp[i] = sum^{n-1}_{k=0} dp[k]*dp[i-k-1] ]

等于左子树情况的数量乘以右子树情况的数量,即左右子树的组合总数。

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n+1, 0); 
        dp[0] = dp[1] = 1;      
        for (int i = 2; i <= n; ++i) {
            for (int k = 0; k < i; ++k) {
                dp[i] += dp[k]*dp[i-k-1];
            }
        }
        return dp[n];
    }
};
原文地址:https://www.cnblogs.com/jeffy-chang/p/7245404.html