#include using namespace std; #define MOD 1000000007 int A[1203], lim[1203]; long long dp[1203][1203], C[1203][1203], fact[1203]; long long mod(long long N) { if(N>=MOD) N%= MOD; return N; } int main() { int N; scanf("%d", &N); fact[0] = 1; for(int i=1; i<=1200; i++) fact[i] = fact[i-1]*i%MOD; for(int i=0; i<=1200; i++) C[i][0] = 1; for(int i=1; i<=1200; i++) for(int j=1; j<=i; j++) C[i][j] = (C[i-1][j-1] + C[i-1][j])%MOD; for(int i=1; i<=N; i++) scanf("%d", &A[i]); for(int i=1; i<=N; i++) { if(i>1 && A[i]>A[i-1]) lim[i] = lim[i-1]; else lim[i] = i; } // dp[i][j] = number of ways to divide such that the last partition // ended at i, and its size was j // dp[i][j] = (dp[i-j][j]*nCr(j, j) + dp[i-j][j+1]*nCr(j+1, j) + dp[i-j][j+2]*nCr(j+2, j) + ...) * fact(j); for(int i=1; i<=N; i++) { for(int j=1; j<=N; j++) { if(i-j>=0 && i-j+1>=lim[i]) { if(j==i) { dp[i][j] = 1; continue; } for(int k=j; k<=i; k++) dp[i][j] += mod(dp[i-j][k]*C[k][j]); dp[i][j] = mod(mod(dp[i][j])*fact[j]); } } } long long ans = 0; for(int i=1; i<=N; i++) ans += dp[N][i]; printf("%lld\n", mod(ans)); return 0; }