/**
 *    author:  [itmo] enot.1.10
 *    created: 17.02.2017 20:28:48       
**/
#define __USE_MINGW_ANSI_STDIO 0
#include <bits/stdc++.h>

#define F first
#define S second
#define pb push_back
#define forn(i, n) for(int i = 0 ; (i) < (n) ; ++i)
#define eprintf(...) fprintf(stderr, __VA_ARGS__),fflush(stderr)
#define sz(a) ((int)(a).size())
#define all(a) (a).begin(),a.end()
#define pw(x) (1LL<<(x))

using namespace std;

typedef long long ll;
typedef double dbl;
typedef vector<int> vi;
typedef pair<int, int> pi;

const int inf = 1.01e9;
const dbl eps = 1e-9;

/* --- main part --- */

const int mod = 1e9 + 7;

const int N = 1300;

int a[N];
int d[N][N];
int cnk[N][N];
int fact[N];

int n;

int go(int l, int r)
{
    if (d[l][r] != -1) return d[l][r];
    if (r == n) return 1;
    int &res = d[l][r];
    res = 0;
    for (int z = r + 1; z <= n; ++z)
    {
        if (z >= r + 2 && a[z - 1] < a[z - 2]) break;
        if (z - r > r - l) break;
        res = (res + go(r, z) * (ll)cnk[r - l][z - r] % mod * (ll)fact[z - r]) % mod;
    }
    return res;
}



int main()
{
    #ifdef home
        assert(freopen("1.in", "r", stdin));
        assert(freopen("1.out", "w", stdout));
    #endif
    forn(i, N)
    {
        cnk[i][0] = 1;
        for (int j = 1; j <= i; ++j) cnk[i][j] = (cnk[i - 1][j - 1] + cnk[i - 1][j]) % mod;
    }
    fact[0] = 1;
    for (int i = 1; i < N; ++i) fact[i] = fact[i - 1] * (ll)i % mod;

    scanf("%d", &n);
    forn(i, n) scanf("%d", &a[i]);
    
    int fst = n;
    for (int i = 0; i < n - 1; ++i) if (a[i] > a[i + 1])
    {
        fst = i + 1;
        break;
    }

    memset(d, -1, sizeof d);

    int res = 0;
    for (int i = 1; i <= fst; ++i) res = (res + go(0, i)) % mod;

    printf("%d\n", res);



    #ifdef home
        eprintf("time = %d ms\n", (int)(clock() * 1000. / CLOCKS_PER_SEC));
    #endif
    return 0;
}