/**
    ▂▃▅▇█▓▒░۩۞۩ ۩۞۩░▒▓█▇▅▃▂
        Make it happen now, not tomorrow.
        Tomorrow is a  loser's excuse.
    ▂▃▅▇█▓▒░۩۞۩ ۩۞۩░▒▓█▇▅▃▂
**/
#ifndef _GLIbCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>

#if __cplu >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdalign>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#include <cstring>
#endif

// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include<random>
#include <chrono>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#if __cplu >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#include <time.h>
#endif
#define __ ios_base::sync_with_stdio(false);cin.tie(NULL);
using namespace std;
// #define INF 0x7f7f7f7f
#define ull unsigned long long int
#define pii pair<int,int>
#define ll long long int
#define ld long double
#define MSET(x,y) memset(x,y,sizeof(x))
// #define l long
#define se second
#define fi first
#define NIL 0
#define UNVISITED -1
#define EXPOLORED 0
#define mk make_pair
#define pb push_back
#define sc(n) scanf("%d",&n)
#define NIL 0
#define pii pair<int,int>
#define eps 1e-8
#define all(x) x.begin(),x.end()
#define me(u,v,w) make_pair(w,make_pair(u,v))
#define sqr(x) x*x
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define inrange(x,y,row,col) (x>=0 && y>=0 && x<row && y<col)
#define foreach(e, x) for(__typeof(x.begin()) e = x.begin(); e != x.end(); ++ e)
// #define add(a,b) (a + b >= MOD ? a+b-MOD:a+b)
#define hs(c1,c2) (256*min(c1,c2) + max(c1,c2))
typedef struct{ int sum,suf,pre,max;} Node;
int toint(const string &s) { stringstream ss; ss << s; int x; ss >> x; return x; }
const int MAXN = 3010;
const int UP = 31;
// const ll inf = 1e18;
const int mod = 1e9+7;
const ll highest = 1e18;
// const int inf = 1e9+10;
// const double pi = 3.141592653589793238462643383;
const double pi = acos(-1);
const double Phi =  1.618033988749894;
const int logn = 20;
const double phi = 0.618033988749894;
const double root5 = 2.236067977;
const int N = 3010;
/**
    ▂▃▅▇█▓▒░۩۞۩ ۩۞۩░▒▓█▇▅▃▂
        Make it happen now, not tomorrow.
        Tomorrow is a loser's excuse.
    ▂▃▅▇█▓▒░۩۞۩ ۩۞۩░▒▓█▇▅▃▂
**/
int dp[N][N];
char k[N];
void add_self(int &a,int b){
    a += b;
    if(a >= mod)a -= mod;
}
char cmp[N];
int main(){
    int n;
    scanf("%d",&n);
    scanf("%s",cmp);
    dp[1][1] = 1;
    int L,R;
    //computer prefix on dp[len-1];
    for(int len = 2;len<=n;++len){
        // std::vector<int> pref(len+1);
        // for(int i){

        // }
        // for(int )
        std::vector<int> pref(len);
        for(int i=1;i<=len-1;++i){
            pref[i] = (pref[i-1] + dp[len-1][i])%mod;
        }
        for(int b=1;b<=len;++b){//new value
            if(cmp[len-2]=='<'){
                L = 1,R = b-1;
            }else{
                L = b,R = len-1;
            }
            if(L<=R){
                add_self(dp[len][b],(pref[R]-pref[L-1]+mod)%mod);
            }
            // for(int i=L;i<=R:++i){
            //     add_self(dp[len][b],dp[len][i]);
            // }
            // for(int a=1;a<=len-1;++a){//old value
            //     int real_a = a;
            //     if(a>=b){
            //         ++real_a;
            //     }
            //     if((real_a<b) != (cmp[len-2] != '<')){
            //         continue;
            //     }
            //     add_self(dp[len][b],dp[len-1][a]);
            // }
        }  
    }
    int ans = 0;
    for(int i=1;i<=n;++i){
        add_self(ans,dp[n][i]);
    }
    cout<<ans<<endl;
    return 0;
}

Measured memory_bytes: 34304