#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <functional>

using namespace std;

const int mod = 1e9 + 7;

struct modint {
	int n;
	modint(int n = 0) : n(n) {}
};

modint operator+(modint a, modint b) { return modint((a.n += b.n) >= mod ? a.n - mod : a.n); }
modint operator-(modint a, modint b) { return modint((a.n -= b.n) < 0 ? a.n + mod : a.n); }
modint operator*(modint a, modint b) { return modint(1LL * a.n * b.n % mod); }
modint &operator+=(modint &a, modint b) { return a = a + b; }

modint dp[1212][1212]; // pos, prevlen

modint fact[1212];
modint invfact[1212];
modint inv[1212];

modint P(int n, int r) {
	return fact[n] * invfact[n - r];
}

int main() {
	int n;
	cin >> n;
	vector<int> a(n);
	for (int i = 0; i < n; i++) scanf("%d", &a[i]);

	inv[1] = 1;
	for (int i = 2; i < 1212; i++) {
		inv[i] = inv[mod % i] * (mod - mod / i);
	}

	fact[0] = 1;
	invfact[0] = 1;
	for (int i = 1; i < 1212; i++) {
		fact[i] = fact[i - 1] * i;
		invfact[i] = invfact[i - 1] * inv[i];
	}

	dp[1][1] = 1;
	for (int i = 2; i <= n; i++) {
		if (a[i - 2] < a[i - 1]) {
			dp[i][i] = 1;
		} else {
			break;
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 1; j <= i; j++) {
			dp[i + 1][1] += dp[i][j] * P(j, 1);
			for (int k = 2; k <= j && i + k <= n; k++) {
				if (a[i + k - 2] < a[i + k - 1]) {
					dp[i + k][k] += dp[i][j] * P(j, k);
				} else break;
			}
		}
	}

	modint ans = 0;
	for (int i = 0; i < 1212; i++) {
		ans += dp[n][i];
	}
	cout << ans.n << endl;
}