#include <bits/stdc++.h>

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;
}