Problem:
Score : 100 points

Problem Statement

Let N be a positive integer.
You are given a string s of length N - 1, consisting of < and >.

Find the number of permutations (p_1, p_2, \ldots, p_N) of (1, 2, \ldots, N) that satisfy the following condition, modulo 10^9 + 7:

For each i (1 \leq i \leq N - 1), p_i < p_{i + 1} if the i-th character in s is <, and p_i > p_{i + 1} if the i-th character in s is >.

Constraints

N is an integer.

2 \leq N \leq 3000

s is a string of length N - 1.

s consists of < and >.

Input

Input is given from Standard Input in the following format:

N
s

Output

Print the number of permutations that satisfy the condition, modulo 10^9 + 7.

Sample Input 1

4
<><

Sample Output 1

5

There are five permutations that satisfy the condition, as follows:

(1, 3, 2, 4)

(1, 4, 2, 3)

(2, 3, 1, 4)

(2, 4, 1, 3)

(3, 4, 1, 2)

Sample Input 2

5
<<<<

Sample Output 2

1

There is one permutation that satisfies the condition, as follows:

(1, 2, 3, 4, 5)

Sample Input 3

20
>>>><>>><>><>>><<>>

Sample Output 3

217136290

Be sure to print the number modulo 10^9 + 7.

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>

using namespace std;

const int nax = 3005;
const int mod = 1e9 + 7;

void add_self (int &a,int b)
{
    a+=b;
    if (a>=mod)
        a-=mod;
}

int dp[nax][nax],pref[nax][nax];
int main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    ios_base::sync_with_stdio(false);

    int n;
    cin >> n;
    string s;
    cin >> s;

    dp[1][1]=1;
    for (int len=2;len<=n;len++)
    {
        for (int i=1;i<len;i++)
            pref[len-1][i]=(pref[len-1][i-1]+dp[len-1][i])%mod;
        for (int b=1;b<=len;b++)
        {
            int L,R;
            if (s[len-2]=='<')
                L=1,R=b-1;
            else
                L=b,R=len-1;

            if (L<=R)
            add_self(dp[len][b],(pref[len-1][R]-pref[len-1][L-1]+mod)%mod);
        }
    }

    int answer=0;
    for (int i=1;i<=n;i++)
        add_self(answer,dp[n][i]);

    cout << answer;
}