#include using namespace std; inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;} const int maxn = 1200 + 50; const int mod = 1e9 + 7; inline void Upd( int & x , int v ){ x += v; if( x >= mod ) x -= mod; } inline int mul( int x , int y ){ return 1LL * x * y % mod; } int n , C[maxn][maxn] , dp[maxn][maxn] , a[maxn] , g[maxn][maxn] , fac[maxn]; void PreDeal(){ C[0][0] = 1; fac[0] = 1; for(int i = 1 ; i < maxn ; ++ i) fac[i] = mul( fac[i - 1] , i ); for(int i = 1 ; i < maxn ; ++ i){ C[i][0] = 1; for(int j = 1 ; j <= i ; ++ j) Upd( C[i][j] , C[i - 1][j - 1] + C[i - 1][j] ); } } int main( int argc , char * argv[] ){ PreDeal(); n = read(); for(int i = 1 ; i <= n ; ++ i) a[i] = read(); for(int i = 1 ; i <= n ; ++ i){ g[i][i] = 1; for(int j = i + 1 ; j <= n ; ++ j) if( a[j] > a[j - 1] ) g[i][j] = 1; else break; } for(int i = 1 ; i <= n ; ++ i) if( g[1][i] ) dp[i][i] = 1; for(int i = 1 ; i <= n ; ++ i) for(int j = 1 ; j <= i ; ++ j) if( dp[i][j] ) for(int k = 1 ; k <= j ; ++ k) if( g[i + 1][i + k] ) Upd( dp[i + k][k] , mul( dp[i][j] , mul( C[j][k] , fac[k] ) ) ); else break; int ans = 0; for(int i = 1 ; i <= n ; ++ i) Upd( ans , dp[n][i] ); printf( "%d\n" , ans ); return 0; }