#include #define fi(a,b,c) for(int a=b; a<=c; a++) #define fd(a,b,c) for(int a=b; a>=c; a--) #define fii(a,b,c) for(int a=b; a pi; typedef vector vi; typedef vector vii; const int MOD = (int) 1e9 + 7; const int oo = (int) 1e9; const ll ooll = (ll)(1e18); const ld EPS = 1e-9; const int N = 2000; ll dp[N][N]; int n, a[N]; bool f[N][N]; ll GT[N], invGT[N]; ll Pow(ll x, int n) { if (n == 0) return 1; if (n == 1) return x; ll kk = Pow(x, n / 2); if (n & 1) return (((kk * kk) % MOD) * x) % MOD; return (kk * kk) % MOD; } int main() { //freopen("test.in", "r", stdin); scanf("%d", &n); fi(i, 1, n) scanf("%d", &a[i]); GT[0] = 1; fi(i, 1, n) GT[i] = (GT[i-1] * (ll)i) % MOD; fi(i, 0, n) invGT[i] = Pow(GT[i], MOD - 2); fi(i, 1, n) f[i][i] = 1; fi(i, 1, n) { fi(j, i + 1, n) f[i][j] = f[i][j - 1] && (a[j] > a[j-1]); } fi(i, 1, n) fi(j, 1, i) { if (f[i - j + 1][i] == 0) continue; if (i == j) dp[i][j] = 1; else { fi(k, j, i - j) { dp[i][j] += (((dp[i - j][k] * GT[k]) % MOD) * invGT[k - j]) % MOD; dp[i][j] %= MOD; } } } ll ans = 0; fi(k, 1, n) { ans += dp[n][k]; ans %= MOD; } printf("%lld", ans); }