/*AMETHYSTS*/ #pragma comment(linker, "/STACK:1000000000") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long #define ld long double #define pii pair #define mp make_pair using namespace std; const int maxn = (int)2e3 + 10; const ll mod = (ll)1e9 + 7; const ll inf = (ll)1e9 + 7; ll n, a[maxn], f[maxn], dp[maxn][maxn], sdp[maxn][maxn], rf[maxn]; ll bpow(ll x, ll y) { if (y == 0) { return 1; } if (y == 1) { return x; } if (y % 2 == 0) { ll tmp = bpow(x, y / 2); return (tmp * tmp) % mod; } else { return (x * bpow(x, y - 1)) % mod; } } int main() { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } f[0] = 1; rf[0] = 1; for (int i = 1; i <= n; i++) { f[i] = f[i - 1] * i; f[i] %= mod; rf[i] = bpow(f[i], mod - 2); } for (int i = 0; i < n; i++) { int j = i; while (j >= 0 && (j == i || a[j] <= a[j + 1])) { int len = i - j + 1; if (j > 0) { //dp[i][len] += (f[len] * sdp[j - 1][len]) % mod; for (int z = len; z <= j; z++) { dp[i][len] += (((f[z] * dp[j - 1][z]) % mod) * rf[z - len]) % mod; dp[i][len] %= mod; } } else { if (i != n - 1) { dp[i][len] += 1;//f[len]; } else { dp[i][len] += 1; } } dp[i][len] %= mod; j--; } for (int j = n; j >= 0; j--) { sdp[i][j] = sdp[i][j + 1] + dp[i][j]; sdp[i][j] %= mod; } } cout << sdp[n - 1][0]; return 0; }