[cpp]
/**題目大意:給定1~n各節點,建立二叉搜索樹,求樹的深度大於等於h的個數
*本題糾結一天未果,最後根據某大牛的思路寫來了。
*狀態轉移方程: dp[n][h] = sum{dp[i][h-1] * dp[n-i-1][h-1]};
*其中: n為數的節點數, h數的深度, dp[n][h]為以n個節點建立的深度不大於
*h的樹的個數; i為左子樹的節點數, n-i-1為右子樹的節點數, 左子樹的
*總數乘以右子樹的總數即為該二叉樹的總數。 www.2cto.com
*初始狀態: dp[i][0] = 0; dp[0][i] = 1; (0<=i<n)
*打表求出所有解,然後dp[n][n] - dp[n][h-1] 即為深度大於h的個數
* (不大於n的減去不大於h-1)
*/
#include <cstdio>
using namespace std;
#define MAX 36
long long dp[MAX][MAX];
void binary_search_tree(){
for(int h = 1; h < MAX; h ++){
dp[0][h-1] = 1;
for(int n = 1; n < MAX; n ++){
for(int i= 0; i < n; i ++){
dp[n][h] += dp[i][h-1] * dp[n-i-1][h-1];
}
}
}
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
binary_search_tree();
int n, h;
while( ~scanf("%d %d", &n, &h) ){
printf("%lld\n", dp[n][n] - dp[n][h-1]);
}
return 0;
}