#include <sstream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <string>
#include <cassert>
#include <ctime>
#include <map>
#include <math.h>
#include <cstdio>
#include <set>
#include <deque>
#include <memory.h>
#include <queue>

#pragma comment(linker, "/STACK:64000000")
typedef long long ll;

using namespace std;

const int MAXK = -1;
const int MAXN = 1222;
const int MOD = 1000 * 1000 * 1000 + 7;

int dp[MAXN][MAXN];
int fct[MAXN], ofct[MAXN];



int solve(vector<int> a) {
	int n = a.size();

	memset(dp, 0, sizeof(dp));
	for (int i = 1; i <= n; i++) {
		if (i > 1 && a[i - 1] < a[i - 2]) break;
		dp[i][i] = 1;
	}
	for (int i = 1; i < n; i++) {
		//cerr << i << endl;
		for (int j = 1; j <= i; j++) {
			if (dp[i][j] == 0) continue;
			for (int k = 1; k <= j && i + k <= n; k++) {
				if (k > 1 && a[i + k - 1] < a[i + k - 2]) break;
				dp[i + k][k] = (dp[i + k][k] + dp[i][j] * 1LL * fct[j] % MOD * ofct[j - k]) % MOD;
			}
		}
	}
	int ans = 0;
	for (int i = 0; i <= n; i++) ans = (ans + dp[n][i]) % MOD;
	return ans;
}

int bin(int a, int n) {
	int res = 1;
	while (n) {
		if (n & 1) res = 1LL * res * a % MOD;
		a = 1LL * a * a % MOD;
		n >>= 1;
	}
	return res;
}

int inv(int x) {
	return bin(x, MOD - 2);
}

void precalc() {
	fct[0] = 1;
	for (int i = 1; i < MAXN; i++) {
		fct[i] = 1LL * fct[i - 1] * i % MOD;
	}
	ofct[MAXN - 1] = inv(fct[MAXN - 1]);
	for (int i = MAXN - 2; i >= 0; i--) ofct[i] = 1LL * ofct[i + 1] * (i + 1) % MOD;
}

int main() {
#ifdef _MSC_VER
	freopen("input.txt", "r", stdin);
#endif
	precalc();

	int n;
	while (cin >> n) {
		vector<int> a(n);
		for (int i = 0; i < n; i++) cin >> a[i];

		/*n = 1200;
		a.resize(n);
		for (int i = 0; i < n; i++) a[i] = i + 1;*/

		cout << solve(a) << endl;
	}

	return 0;
}