DP5. 有多少个不同的二叉搜索树
描述
输入描述
输出描述
输出组成不同二叉搜索树的方法数。示例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; }