#include #define FOR(i,b,e) for(int i=(b); i <= (e); ++i) #define FORD(i,b,e) for(int i=(b); i >= (e); --i) #define SIZE(c) (int) (c).size() #define FORE(i,c) FOR(i,0,SIZE(c)-1) #define FORDE(i,c) FORD(i,SIZE(c)-1,0) #define pb push_back #define mp make_pair #define st first #define nd second using namespace std; typedef long long ll; typedef pair pii; typedef pair pll; typedef vector VI; typedef vector VB; typedef vector VP; typedef vector VL; typedef vector VPL; typedef vector VVI; typedef vector VVL; typedef vector VVB; typedef vector VVP; const int MOD = 1000000007; const int INF = 1000000001; const ll LINF = 1000000000000000001LL; ll expo(ll a, ll n, ll mod) { ll ans = 1; while (n) { if (n & 1LL) ans = (ans * a) % mod; n >>= 1; a = (a * a) % mod; } return ans; } ll revMod(ll a, ll mod) { return expo(a, mod - 2, mod); } const int N = 1202; int dp[N][N]; bool inc[N][N]; int fact[N], revFact[N]; void pre() { fact[0] = revFact[0] = 1; FOR(i,1,N-1) { fact[i] = ((ll) fact[i-1] * i) % MOD; revFact[i] = (revFact[i-1] * revMod(i, MOD)) % MOD; } } /*************************************************************************/ int main() { ios_base::sync_with_stdio(0); pre(); int n; cin >> n; VI tab(n); FOR(i,0,n-1) { cin >> tab[i]; } FOR(i,0,n-1) { inc[i][i] = true; FOR(j,i+1,n-1) { inc[i][j] = inc[i][j-1] && (tab[j-1] < tab[j]); } } FOR(i,0,n-1) { if (inc[0][i]) { dp[i][i+1] = 1; } FOR(len,1,i+1) if (dp[i][len]) { FOR(nextLen,1,min(len,n-1-i)) { int j = i + nextLen; if (!inc[i+1][j]) break; int diff = len - nextLen; ll factDiv = ((ll) fact[len] * revFact[diff]) % MOD; dp[j][nextLen] = (dp[j][nextLen] + factDiv * dp[i][len]) % MOD; } } } ll ans = 0; FOR(len,0,n) { ans += dp[n-1][len]; } ans %= MOD; cout << ans; return 0; } /*************************************************************************/