#include <bits/stdc++.h>
int IntMaxVal = (int)1e20;
int IntMinVal = (int)-1e20;
long long LongMaxVal = (long long)1e20;
long long LongMinVal = (long long)-1e20;
using namespace std;
template <typename T>
struct argument_type;
template <typename T, typename U>
struct argument_type<T(U)> {};
template <typename T1, typename T2>
istream& operator>>(istream& is, pair<T1, T2>& s) {
  is >> s.first >> s.second;
  return is;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  for (int i = 0; i < v.size(); i++) os << v[i] << ' ';
  os << '\n';
  ;
  return os;
}
template <typename T1, typename T2>
ostream& operator<<(ostream& s, pair<T1, T2>& t) {
  s << t.first << ' ' << t.second;
  return s;
}
template <typename T>
vector<T> readVector(int n) {
  vector<T> res(n);
  for (int i = 0; i < n; i++) cin >> res[i];
  return res;
}
int main() {
  srand(time(NULL));
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  cin >> n;
  ;
  int h;
  cin >> h;
  ;
  long long dp[n + 1][n + 1];
  for (int x = 0; x < n + 1; ++x)
    for (int ih = 0; ih < n + 1; ++ih) {
      if (x == 0 && ih == 0) {
        dp[x][ih] = 1;
      } else if (x == 0)
        dp[x][ih] = 0;
      else if (ih == 0)
        dp[x][ih] = 0;
      else {
        dp[x][ih] = 0;
        for (int i = 0; i < x; ++i) {
          int l = i;
          int r = x - i - 1;
          for (int hl = 0; hl < l + 1; ++hl)
            for (int hr = 0; hr < r + 1; ++hr)
              if (max(hl, hr) + 1 == ih) dp[x][ih] += dp[l][hl] * dp[r][hr];
        }
      }
    }
  long long res = 0;
  for (int ih = h; ih < n + 1; ++ih) res += dp[n][ih];
  cout << res;
}
