列表

详情


DP5. 有多少个不同的二叉搜索树

描述

给定一个由节点值从 1 到 n 的 n 个节点。请问由多少种不同的方法用这 n 个节点构成互不相同的二叉搜索树。

数据范围:

输入描述

仅一行输入一个正整数 n ,表示节点的数量。

输出描述

输出组成不同二叉搜索树的方法数。

示例1

输入:

3

输出:

5

示例2

输入:

2

输出:

2

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 348KB, 提交时间: 2022-07-22

#include <stdio.h>



int main()
{
    
    int n;
    scanf("%d",&n);
    
    int dp[25]={0};
    
    int i,j;
    dp[0]=1;
    dp[1]=1;
    
    for(i=2;i<=n;i++)
    {
        for(j=0;j<=i;j++)
        {
            dp[i]+=dp[j-1]*dp[i-j];
        }
    }
    
    
    
    printf("%d",dp[n]);
    
    
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 432KB, 提交时间: 2022-06-19

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    
    int *dp = (int *)malloc(sizeof(int) * (n + 1));
    dp[0] = 1;
    dp[1] = 1;
    int i = 2;
    while(i <= n) {
        int sum = 0, halfI = i / 2;
        for (int j = 0; j < halfI; j++) {
            sum += 2 * (dp[j] * dp[i - 1 - j]);
        }
        if (i % 2 != 0) {
            sum += dp[halfI] * dp[halfI];
        }
        dp[i] = sum;
        i++;
    }

    printf("%d", dp[n]);
    
    free(dp);
    
    return 0;
}





C 解法, 执行用时: 3ms, 内存消耗: 340KB, 提交时间: 2022-06-29

#include <stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    printf("%d",fun(n));
    return 0;
}

int fun(n){
    int sum;
    int num[n+1];
    for(int k = 0;k < n+1; k++){
        num[k] = 0;
    }
    if(n < 2)
        return n;
    num[0] = 1;
    num[1] = 1;
    for(int i = 2;i <= n;i++){
        for(int j = 1;j <= i;j++){
            num[i] += num[j-1]*num[i-j];
        }
    }
    return num[n];
}

C 解法, 执行用时: 3ms, 内存消耗: 344KB, 提交时间: 2022-06-05

#include <stdio.h>
#include <string.h>
 
int fun(int n) {
    if (n <= 1)
        return 1;
    if (n == 2)
        return 2;
    int dp[n+1];
    memset(dp, 0, sizeof(dp));
    dp[0] = 1;
    dp[1] = 1;
    dp[2] = 2;
    for (int i = 3; i<=n; i++){
        for (int j = 0; j<i; j++) {
            dp[i] += dp[j] * dp[i-j-1]; 
        }
    }   
    
    return dp[n];
}
 
int main() {
    int num;
    scanf("%d", &num);
    int result = fun(num);
    printf("%d\n", result);
    return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 344KB, 提交时间: 2022-05-08

#include <stdio.h>
#include <assert.h>
int main(void) {
    int n;
    while (scanf("%d", &n) != EOF) {
        assert(n > 0 && n <= 19);
        long long a[ n + 1 ];
        a[1] = 1;
        for (int i = 2, i_end = n + 1; i < i_end; ++i) {
            long long z = a[1]++, t;
            for (int j = 2; j < i; ++j) {
                t = a[j];
                a[j] = z + t;
                z = t;
            }
            a[i] = 1;
        }
        for (int i = n + 1, i_end = (n << 1) + 1; i < i_end; ++i) {
            long long z = a[1]++, t;
            for (int j = 2, j_end = n + 1; j < j_end; ++j) {
                t = a[j];
                a[j] = z + t;
                z = t;
            }
        }
        printf("%lld\n", a[n] / (n + 1));
    }
    return 0;
}

上一题