#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include using namespace std; #define ALL(x) (x).begin(),(x).end() template inline bool checkmin(T &a, T b) { if (b < a) { a = b; return 1; } return 0; } template inline bool checkmax(T &a, T b) { if (b > a) { a = b; return 1; } return 0; } typedef long long ll; const int N = 1234; const int mod = (int)1e9 + 7; int a[N]; int comb[N][N]; int fact[N]; bool asc[N][N]; int dp[N][N]; inline int mulmod(int a, int b) { return (ll)a * b % mod; } int main() { ios::sync_with_stdio(0); int n; cin >> n; for (int i = 1; i <= n; ++i) { cin >> a[i]; } for (int i = 1; i <= n; ++i) { for (int j = 0; i + j <= n; ++j) { if (j == 0 || (asc[i][i + j - 1] && a[i + j - 1] <= a[i + j])) { asc[i][i + j] = true; } } } fact[0] = 1; for (int i = 1; i <= n; ++i) { fact[i] = mulmod(fact[i - 1], i); } for (int i = 0; i <= n; ++i) { for (int j = 0; j <= i; ++j) { comb[i][j] = j == 0 ? 1 : (comb[i - 1][j - 1] + comb[i - 1][j]) % mod; } } for (int i = 1; i <= n; ++i) { if (asc[1][i]) { dp[i][i] = 1; } } for (int i = 1; i < n; ++i) { for (int j = 1; j <= i; ++j) { if (dp[i][j]) {//cerr << i << ' ' << j << ' ' << dp[i][j] << endl; for (int k = 1; k <= n - i && k <= i; ++k) { if (asc[i + 1][i + k]) { dp[i + k][k] += mulmod(dp[i][j], mulmod(comb[j][k], fact[k])); if (dp[i + k][k] >= mod) { dp[i + k][k] -= mod; } } } } } } int ans = 0; for (int i = 1; i <= n; ++i) { (ans += dp[n][i]) %= mod; } cout << ans << endl; }