#include <bits/stdc++.h>
struct Input {
  int numNodes;
  int minHeight;
};
void runTest();
Input parseInput();
long long computeResult(const Input& in);
std::vector<long long> precomputeNumTrees(int numNodes);
void printOutput(long long numTrees);
int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);
  runTest();
  return 0;
}
void runTest() {
  Input in = parseInput();
  long long numTrees = computeResult(in);
  printOutput(numTrees);
}
Input parseInput() {
  Input in;
  std::cin >> in.numNodes >> in.minHeight;
  return in;
}
long long computeResult(const Input& in) {
  std::vector<long long> numTrees = precomputeNumTrees(in.numNodes);
  std::vector<long long> memo(in.numNodes + 1);
  for (int n = 0; n <= in.numNodes; n++) {
    memo[n] = n == 0 ? 1 : numTrees[n];
  }
  for (int h = 1; h <= in.minHeight; h++) {
    std::vector<long long> newMemo(in.numNodes + 1);
    for (int n = 0; n <= in.numNodes; n++) {
      long long value = 0;
      for (int root = 1; root <= n; root++) {
        value += memo[root - 1] * numTrees[n - root];
        value += numTrees[root - 1] * memo[n - root];
        value -= memo[root - 1] * memo[n - root];
      }
      newMemo[n] = value;
    }
    memo = newMemo;
  }
  return memo[in.numNodes];
}
std::vector<long long> precomputeNumTrees(int numNodes) {
  std::vector<long long> result(numNodes + 1);
  result[0] = 1;
  for (int n = 1; n <= numNodes; n++) {
    long long value = 0;
    for (int root = 1; root <= n; root++) {
      value += result[root - 1] * result[n - root];
    }
    result[n] = value;
  }
  return result;
}
void printOutput(long long numTrees) { std::cout << numTrees << std::endl; }
