zoukankan      html  css  js  c++  java
  • 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]即为所求。

  • 相关阅读:
    字符串类型
    数据类型之整型
    数据类型
    两个版本的区别
    变量
    DHCP
    MySQL数据库编译及入门
    NFS网络文件系统
    Rsync 数据同步
    互联网数据分享平台
  • 原文地址:https://www.cnblogs.com/asenyang/p/9774536.html
Copyright © 2011-2022 走看看