#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define F first #define S second #define mp make_pair #define pb push_back #define epr(...) fprintf(stderr, __VA_ARGS__) #define db(x) cerr << #x << " = " << x << endl #define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n"; #define db3(x, y, z) cerr << "(" << #x << ", " << #y << ", " << #z << ") = (" << x << ", " << y << ", " << z << ")\n" #define all(a) (a).begin(), (a).end() #define sz(a) (int)a.size() #define pw(n) (1ll << (n)) #define equal equalll #define less lesss const int N = 1333; const long long INF = 1e9 + 19; typedef long long ll; typedef vector vi; typedef pair pi; const int MOD = 1e9 + 7; int n; int a[N]; ll dp[N][N]; void upd(ll& A, ll B) { A = (A + B) % MOD; } int main(){ #ifdef HOME freopen("in", "r", stdin); //freopen("test.txt", "r", stdin); #endif scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } dp[0][n] = 1; int cc = 0; for (int i = 0; i < n; i++) { for (int len = 1; len <= n; len++) { if (dp[i][len] == 0) continue; ll cof = 1; for (int step = 1; step <= len; step++) { cc++; if (step >= 2 && a[i + step - 1] < a[i + step - 2]) break; cof = cof * (len - step + 1) % MOD; if (i == 0) cof = 1; upd(dp[i + step][step], dp[i][len] * cof); } } } ll res = 0; for (int i = 0; i <= n; i++) res += dp[n][i]; cout << res % MOD << endl; //db(cc * 1.0 / n / n); //cerr << clock() * 1.0 / CLOCKS_PER_SEC << endl; return 0; }