Unique Binary Search Trees

class Solution {
public:
    int numTrees(int n) {
       vector<int> node(n+1,0);//注意这里是n+1;
        node[0]=1;
        node[1]=1;
        for(int i=2;i<=n;i++){
            for(int j=0;j<=i;j++)
                node[i]+=node[j]*node[i-j-1];
        }
        return node[n];
    }
};

这道题开始没有思路,百度了一下,用到了一个叫卡塔兰数的东西,和斐波那契数列一样,也是一个递推序列

dp[2] =  dp[0] * dp[1]   (1为根的情况)

    + dp[1] * dp[0]    (2为根的情况)

同理可写出 n = 3 的计算方法:

dp[3] =  dp[0] * dp[2]   (1为根的情况)

    + dp[1] * dp[1]    (2为根的情况)

      + dp[2] * dp[0]    (3为根的情况)


由此可以得出卡塔兰数列的递推式为:

接着累加即可。

 

posted @ 2019-01-03 23:12  keep!  阅读(119)  评论(0编辑  收藏  举报
Live2D