1 #include<iostream>
2 #include<string>
3 #include<queue>
4 #include<stack>
5 #include<vector>
6 #include<map>
7 #include<cstdio>
8 #include<cstdlib>
9 #include<algorithm>
10 #include<set>
11 #include<list>
12 #include<iomanip>
13 #include<cstring>
14 #include<cmath>
15 #include<limits>
16 #include<cctype>
17 using namespace std;
18
19 #define debug(i) cout<<"<debug> "<<i<<" <\debug>"<<endl
20 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
21 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
22 #define lll __int128
23 #define Re register
24 #define mem(a,b) memset(a,(b),sizeof(a))
25 #define Design ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
26 typedef pair<int, int> intpair;
27 typedef pair<long long int, long long int> llpair;
28 typedef long long int ll;
29 const int INF = 0x3f3f3f3f;
30 const long long int INFLL = 0x3f3f3f3f3f3f3f3f;
31
32 int cnt;
33 int n;
34 const int maxn = 10010;
35 int f[maxn];
36 int a[maxn];
37 int s;
38
39 struct Edge
40 {
41 int v, nxt;
42 int w;
43 }e[maxn];
44
45 int head[maxn];
46
47 inline void init()
48 {
49 memset(head, -1, sizeof(head));
50 cnt = 1;
51 }
52
53 int d[maxn];
54 int now[maxn];
55 int st, ed;
56
57 void add_dinic(int u, int v)
58 {
59 e[++cnt].v = v;
60 e[cnt].w = 0;
61 e[cnt].nxt = head[u];
62 head[u] = cnt;
63 }
64
65 int dfs_dinic(int x, int flow)
66 {
67 if (x == ed) return flow;
68 int res = 0;
69 for (int i = now[x]; i != -1; i = e[i].nxt)
70 {
71 int v = e[i].v;
72 now[x] = i;
73 if (d[v] + 1 == d[x] && e[i].w > 0)
74 {
75 int k = dfs_dinic(v, min(e[i].w, flow));
76 res += k;
77 flow -= k;
78 e[i].w -= k;
79 e[i ^ 1].w += k;
80 if (!flow) break;
81 }
82 }
83 return res;
84 }
85
86 bool bfs_dinic()
87 {
88 memset(d, 0, sizeof(d));
89 queue<int>q;
90 q.push(ed);
91 d[ed] = 1;
92 while (!q.empty())
93 {
94 int u = q.front();
95 q.pop();
96 for (int i = head[u]; i != -1; i = e[i].nxt)
97 {
98 int v = e[i].v;
99 if (!d[v] && e[i ^ 1].w > 0)
100 {
101 q.push(v);
102 d[v] = d[u] + 1;
103 }
104 }
105 }
106 return d[st] > 0;
107 }
108
109
110 int dinic()
111 {
112 int flow = 0;
113 while (bfs_dinic())
114 {
115 for (int i = 0; i <= ed; i++) now[i] = head[i];
116 flow += dfs_dinic(st, INF);
117 }
118 return flow;
119 }
120
121 void add(int u, int v, int w)
122 {
123 e[++cnt].v = v;
124 e[cnt].nxt = head[u];
125 head[u] = cnt;
126 e[cnt].w = w;
127 add_dinic(v, u);
128 }
129
130 int main()
131 {
132 Design;
133 init();
134 cin >> n;
135 mfor(i, 1, n) f[i] = 1, cin >> a[i];
136 mfor(i, 1, n)
137 {
138 mfor(j, 1, i - 1)
139 {
140 if (a[j] <= a[i]) f[i] = max(f[i], f[j] + 1);
141 }
142 }
143 mfor(i, 1, n) s = max(s, f[i]);
144 cout << s << endl;
145 st = maxn - 2;
146 ed = maxn - 1;
147 mfor(i, 1, n)
148 {
149 add(i, i + n, 1);
150 if (f[i] == 1)
151 {
152 add(st, i, 1);
153 }
154 if (f[i] == s)
155 {
156 add(i + n, ed, 1);
157 }
158 }
159 mfor(i, 1, n)
160 {
161 mfor(j, 1, i - 1)
162 {
163 if (a[j] <= a[i] && f[j] + 1 == f[i]) add(j + n, i, 1);
164 }
165 }
166 int maxf;
167 cout << (maxf = dinic()) << endl;
168 add(1, 1 + n, INF);
169 add(st, 1, INF);
170 if (f[n] == s)
171 {
172 add(n, n + n, INF);
173 add(n + n, ed, INF);
174 }
175 cout << maxf + dinic() << endl;
176 }