#include <bits/stdc++.h>
#define REP(i,s,e) for(int i=(s); i<(e);i++)
#define rep(i,n) REP(i,0,n)
#define rep1(i,n) REP(i,1,n)
#define repe(i,n) for(auto &&i:n)
#define all(v) (v).begin(),(v).end()
#define decimal fixed<<setprecision(20)
#define fastcin() cin.tie(0);ios::sync_with_stdio(false)
using namespace std;
using LL = long long;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
const int INF = 1e9;
const LL LLINF = 1e16;

template<int mod>
struct ModInt {
    int x;

    ModInt() : x(0) {}
    ModInt(long long y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}

    ModInt &operator+=(const ModInt &p) {
        if((x += p.x) >= mod) x -= mod;
        return *this;
    }
    ModInt &operator-=(const ModInt &p) {
        if((x += mod - p.x) >= mod) x -= mod;
        return *this;
    }
    ModInt &operator*=(const ModInt &p) {
        x = (int)(1LL * x * p.x % mod);
        return *this;
    }
    ModInt &operator/=(const ModInt &p) {
        *this *= p.inverse();
        return *this;
    }

    ModInt operator-() const { return ModInt(-x); }
    ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }
    ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }
    ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }
    ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }

    bool operator==(const ModInt &p) const { return x == p.x; }
    bool operator!=(const ModInt &p) const { return x != p.x; }

    ModInt inverse() const{
        int a = x, b = mod, u = 1, v = 0, t;
        while(b > 0) {
            t = a / b;
            a -= t * b;
            swap(a, b);
            u -= t * v;
            swap(u, v);
        }
        return ModInt(u);
    }

    ModInt pow(int e){
        long long a = 1, p = x;
        while(e > 0) {
            if(e%2 == 0) {p = (p*p) % mod; e /= 2;}
            else {a = (a*p) % mod; e--;}
        }
        return ModInt(a);
    }

    friend ostream &operator<<(ostream &os, const ModInt<mod> &p) {
        return os << p.x;
    }
    friend istream &operator>>(istream &is, ModInt<mod> &a) {
        long long x;
        is >> x;
        a = ModInt<mod>(x);
        return (is);
    }
};

const int mod = 1e9 + 7;
using modint = ModInt<mod>;

// i番目まで見て、左j個、右k個が未確定
modint dp[222][222][222];

int main(){
    fastcin();

    int n;
    cin >> n;
    vector<char> c(n);
    rep(i, n) cin >> c[i];
    dp[0][0][0] = 1;
    rep(i, n)rep(j, n)rep(k, n){
        if(c[i] == '-'){
            dp[i+1][j][k] += dp[i][j][k];
        }else if(c[i] == 'D'){
            // i+1番目について、右側は必ず残っている左側j個から選ぶ j通り j -> j-1

            // 左側の行き先を決める 残っている左側k通り k -> k-1
            if(j>0 && k>0) dp[i+1][j-1][k-1] += dp[i][j][k]*j*k;
            // 左側の行き先を決めない k -> k で、左の未確定+1 (j -> j)
            dp[i+1][j][k] += dp[i][j][k]*j;
        }else{
            // i+1番目について、右側は未確定にしておくしかない k -> k+1

            // 左側の行き先を決める k通り 決めると一つ減るので k -> k
            dp[i+1][j][k] += dp[i][j][k]*k;
            // 左側の行き先を決めない 左の未確定+1 (j -> j+1)
            dp[i+1][j+1][k+1] += dp[i][j][k];
        }
    }
    cout << dp[n][0][0] << endl;

}


Measured memory_bytes: 45896