#include #define LL long long #define ABS(a) (((a) > 0) ? (a) : (-(a))) #define FOR(i,n) for(int i=0;i<(n);++i) #define FORIT(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++) #define all(o) (o).begin(), (o).end() #define pb push_back #define mp make_pair #define mset(m,v) memset(m,v,sizeof(m)) #define INF 0x3f3f3f3f #define INFL 0x3f3f3f3f3f3f3f3fLL #define MOD 1000000007 using namespace std; typedef vector vi; typedef pair pii; template ostream& operator<<(ostream& s, vector& v) { s << '{'; for (int i = 0 ; i < v.size(); ++i) s << (i ? "," : "") << v[i]; return s << '}'; } template ostream& operator<<(ostream &s, pair& p) { return s << "(" << p.first << "," << p.second << ")"; } int N; vi A; LL pdp[1205][1205]; LL dp[1205][1205]; // number of ways if we're at step n, max layer size is m LL f(int n, int m){ LL &ans = dp[n][m]; if(ans != -1){ return ans; } // Trivial cases if(m == 1){ ans = 1; return ans; } if(n == N){ ans = 1; return ans; } ans = 0; for(int m2 = 1; m2 <= m; m2++){ // can't do it if past end of string if(n + m2 > N) break; // can't do it if A[m2] decreasing if(m2 > 1 && A[n + m2 - 1] < A[n + m2 - 2]) break; LL d = f(n + m2, m2); if(n == 0){ ans += d; } else{ ans = (ans + d * pdp[m][m2]) % MOD; } } //cout << n << " " << m << " " << ans << endl; return ans; } // 869171677 int main(){ FOR(i, 1205) FOR(j, 1205) dp[i][j] = -1; FOR(i, 1205) FOR(j, 1205) pdp[i][j] = -1; // optimization: calculate perms FOR(i, 1201){ FOR(j, i+1){ if(j == 0){ pdp[i][j] = 1; } else{ pdp[i][j] = (i * pdp[i-1][j-1]) % MOD; } } } cin>>N; FOR(n,N){ int t;cin>>t; A.pb(t); } LL ans = f(0, N) % MOD; cout << ans << endl; }