题意:一个二叉树满足左儿子比自己小,右儿子比自己大的特性,有n个节点,问深度大于等于h的一共有多少种。
题解:对于第i个结点,把它看做根,那么合法的组合方案就是左子树的总数*右子树的总数,于是转移方程为
dp[i][j] = dp[k][j-1] * dp[i - k - 1][j-1] ,0 <= k < i ,i:使用i个结点,j:深度
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[40][40];
int main(){
int n, h;
scanf("%d %d", &n, &h);
for(int i = 0; i <= n; i ++)
dp[0][i] = 1;
for (int i = 1; i <= n; i ++){
for (int j = 1; j <= n; j ++)
for (int k = 0; k < i; k ++)
dp[i][j] += dp[k][j - 1] * dp[i - k - 1][j - 1];
}
printf("%lld\n", dp[n][n] - dp[n][h - 1]);
return 0;
}