class Solution {
public:
    int numTrees(int n) {
        vector<int> f(n+1,0);
        f[0]=1;
        f[1]=1;
        for(int i=2;i<=n;i++){
            for(int j=1;j<=i;j++){
                f[i]+=f[j-1]*f[i-j];
            }
        }
        return f[n];
    }
};

 

补充一个python的实现:

 1 class Solution:
 2     def numTrees(self, n: 'int') -> 'int':
 3         if n==1:
 4             return 1
 5         else:
 6             dp = [1] * (n+1)
 7             #dp[0]=1
 8             #dp[1]=1            
 9             for t in range(2,n+1):#2->n
10                 i=0
11                 j=t-1
12                 sums = 0
13                 while i<=t-1 and j>=0:
14                     sums += dp[i] * dp[j]
15                     i+=1
16                     j-=1
17                 dp[t]=sums
18             return dp[n]

 

这道题的思路是,从1到n,依次选择某节点作为根节点。假设n=2,

1为根节点:比1小的元素有0个,比1大的元素有1个,因此有dp[0]*dp[1]

2为根节点:比2小的元素有1个,比2大的元素有0个,因此有dp[1]*dp[0]

这两种情况之和,即为dp[2]。

再假设n=3,因为之前已经计算过dp[2]的值了,dp[2]表示2个节点的组合数量,现在要计算dp[3]

1为根:dp[0]*dp[2]

2为根:dp[1]*dp[1]

3为根:dp[2]*dp[0]

以上三项之和为dp[3],最终返回dp[n]即为所求。

posted on 2018-10-11 19:23  Sempron2800+  阅读(144)  评论(0编辑  收藏  举报