leetcode96

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]即为所求。

转载于:https://www.cnblogs.com/asenyang/p/9774536.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值