#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
inline void upd(int& x, int y) {
  x += y;
  x -= x >= mod ? mod : 0;
}
int qpow(int a, int b) {
  int aa = a, res = 1;
  for (; b; b >>= 1) {
    if (b & 1) res = 1ll * res * aa % mod;
    aa = 1ll * aa * aa % mod;
  }
  return res;
}
const int N = 53;
const int ni_2 = qpow(2, mod - 2);
int d[N][N][N], f[2][N][N], bin[N], n, deg[N];
int main() {
  scanf("%d", &n);
  bin[0] = 1;
  for (int i = 1; i <= n; i++) bin[i] = 1ll * bin[i - 1] * i % mod;
  for (int i = 1; i <= n; i++) scanf("%d", &deg[i]);
  int op = 0, res;
  for (int i = 2; i <= n; i++) {
    memset(f[op], 0, sizeof(f[op]));
    f[op][0][0] = 1;
    for (int j = i; j >= 2; j--) {
      memset(f[op ^ 1], 0, sizeof(f[op ^ 1]));
      int len = i - j + 1;
      for (int k = 0; k <= (len << 1); k++) {
        for (int _2 = 0; _2 <= (k >> 1); _2++)
          if (res = f[op][k][_2]) {
            int num = k - 2 * _2;
            if (deg[j] == 3) {
              upd(f[op ^ 1][k + 2][_2 + 1], res);
              upd(f[op ^ 1][k][_2], 1ll * res * num % mod);
              if (_2) upd(f[op ^ 1][k][_2 - 1], 1ll * res * _2 % mod);
              if (num >= 2) {
                upd(f[op ^ 1][k - 2][_2],
                    1ll * num * (num - 1) / 2 * res % mod);
              }
              if (num >= 1) {
                upd(f[op ^ 1][k - 2][_2 - 1], 1ll * num * _2 * res % mod);
              }
              if (_2 >= 2) {
                upd(f[op ^ 1][k - 2][_2 - 2],
                    1ll * _2 * (_2 - 1) / 2 * res % mod);
              }
            } else {
              upd(f[op ^ 1][k + 1][_2], res);
              if (num >= 1) upd(f[op ^ 1][k - 1][_2], 1ll * res * num % mod);
              if (_2) upd(f[op ^ 1][k - 1][_2 - 1], 1ll * res * _2 % mod);
            }
          }
      }
      op ^= 1;
      int tmp = 0;
      if (j == 2) {
        if (len == deg[1]) {
          tmp = 1;
        }
      } else {
        for (int k = 0; k <= len; k++)
          if (res = d[j - 1][len][k]) {
            upd(tmp, 1ll * res * bin[len] % mod * qpow(ni_2, k) % mod);
          }
      }
      if (!tmp) continue;
      for (int k = 0; k <= (len << 1); k++) {
        for (int _2 = 0; _2 <= k; _2++)
          if (res = f[op][k][_2]) {
            upd(d[i][k][_2], 1ll * tmp * res % mod);
          }
      }
    }
  }
  int ans = d[n][0][0];
  printf("%d\n", ans);
  return 0;
}
