[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];
    }
};
posted @ 2017-07-27 16:08  積水成淵  阅读(81)  评论(0编辑  收藏  举报