- #include <bits/stdc++.h>
- using namespace std;
- #define pb push_back
- #define FOR(i,x,y) for(vlong i = (x) ; i <= (y) ; ++i)
- #define CLR(x,y) memset(x,y,sizeof(x))
- #define LL long long
- #define LLU long long unsigned int
- typedef long long vlong;
- typedef unsigned long long uvlong;
-
- const int MXN = 5005;
-
- int N;
- int A[MXN], B[MXN];
- unordered_map<int, int> Map;
- int DP[MXN][MXN];
-
- int call(int u, int len1, int len2){
- if(u == N+1) return 0;
- if(len1>len2) swap(len1, len2);
- if(DP[u][len2] != -1) return DP[u][len2];
-
- int res = 0, ret;
- /// Put A[u] to 1st lane:
- ret = call(u+1, min(len1, A[u]), len2);
- if(A[u]<=len1) ret++;
- res = max(res, ret);
-
- /// Put A[u] to 2nd lane:
- ret = call(u+1, len1, min(len2, A[u]));
- if(A[u]<=len2) ret++;
- res = max(res, ret);
-
- return DP[u][len2] = res;
- }
-
- int main () {
- scanf("%d",&N);
- FOR(i,1,N){
- scanf("%d",&A[i]);
- B[i] = A[i];
- }
- sort(B+1,B+N+1);
- int x = 0;
- FOR(i,1,N){
- if(Map.find(B[i]) == Map.end()){
- Map[B[i]] = x++;
- }
- }
- FOR(i,1,N){
- A[i] = Map[A[i]];
- }
- CLR(DP, -1);
- int res = call(1, 5000, 5000);
- printf("%d\n",res);
-
- return 0;
- }