#include <bits/stdc++.h>
using namespace std;
template <class T>
bool remin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool remax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
int nxt() {
  int first;
  scanf("%" PRId32, &first);
  return first;
}
long long nxtll() {
  long long first;
  scanf("%" PRId64, &first);
  return first;
}
long long gcd(long long a, long long b) {
  a = abs(a);
  b = abs(b);
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
struct pt {
  long long first, second;
  pt() {}
  pt(long long first, long long second) : first(first), second(second) {}
  inline pt operator-(const pt &r) const {
    return pt(first - r.first, second - r.second);
  }
  inline pt operator+(const pt &r) const {
    return pt(first + r.first, second + r.second);
  }
  inline pt operator*(const long double &r) const {
    return pt(first * r, second * r);
  }
  inline long long sqlen() const {
    return abs(first * first + second * second);
  }
  inline bool operator<(const pt &r) const {
    if (first != r.first) return first < r.first;
    return second < r.second;
  }
  inline bool operator==(const pt &r) const {
    return first == r.first && second == r.second;
  }
};
ostream &operator<<(ostream &os, const pt &p) {
  return os << "(" << p.first << "," << p.second << ")";
}
inline long long cross(const pt &l, const pt &r) {
  return l.first * r.second - l.second * r.first;
}
inline long long dot(const pt &l, const pt &r) {
  return l.first * r.first + l.second * r.second;
}
long long pwmod(long long a, long long n, long long mod) {
  long long ret = 1;
  while (n) {
    if (n & 1) ret = ret * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return ret;
}
template <typename T>
inline T sqr(T first) {
  return first * first;
}
const int SZ = 20;
struct Data {
  map<int, pair<int, int> > s;
  void update(const pair<int, pair<int, int> > &d) {
    if (s.count(d.first)) {
      pair<int, int> &pa = s[d.first];
      remax(pa.first, d.second.first);
      remax(pa.second, d.second.second);
    } else {
      s[d.first] = d.second;
      if (s.size() > SZ) {
        auto it = s.end();
        --it;
        s.erase(it);
      }
    }
  }
  int getMoves() { return s.begin()->first; }
};
void solve() {
  int n;
  cin >> n;
  vector<string> c(n);
  vector<int> r(n);
  vector<int> b(n);
  for (int i = 0; i < (int)(n); i++) {
    cin >> c[i] >> r[i] >> b[i];
  }
  vector<Data> dp(1 << n);
  dp[0].s[0] = pair<int, int>(0, 0);
  for (int mask = 0; mask < (1 << n); ++mask) {
    int cntR = 0;
    int cntB = 0;
    for (int i = 0; i < (int)(n); i++) {
      if (mask & (1 << i)) {
        if (c[i] == "R") {
          cntR++;
        } else {
          cntB++;
        }
      }
    }
    for (int i = 0; i < (int)(n); i++) {
      if (mask & (1 << i)) {
        continue;
      }
      for (auto pa : dp[mask].s) {
        int MO = pa.first;
        int RED = pa.second.first;
        int BLUE = pa.second.second;
        {
          int nr = max(0, r[i] - cntR);
          int nb = max(0, b[i] - cntB);
          int hr = RED;
          int hb = 0;
          int moves = max(0, max(nr - hr, nb - hb));
          int Or = hr + moves - nr;
          int Ob = hb + moves - nb;
          assert(Or == 0 || Ob == 0);
          pair<int, pair<int, int> > to{MO + moves, pair<int, int>{Or, Ob}};
          dp[mask | (1 << i)].update(to);
        }
        {
          int nr = max(0, r[i] - cntR);
          int nb = max(0, b[i] - cntB);
          int hr = 0;
          int hb = BLUE;
          int moves = max(0, max(nr - hr, nb - hb));
          int Or = hr + moves - nr;
          int Ob = hb + moves - nb;
          assert(Or == 0 || Ob == 0);
          pair<int, pair<int, int> > to{MO + moves, pair<int, int>{Or, Ob}};
          dp[mask | (1 << i)].update(to);
        }
      }
    }
  }
  cout << dp.back().getMoves() + n << "\n";
}
void prepare() {}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  prepare();
  int t = 1;
  for (int i = 0; i < (int)(t); i++) {
    solve();
  }
  cerr << "Time " << clock() / (double)CLOCKS_PER_SEC << endl;
  return 0;
}
