#include <bits/stdc++.h>
using namespace std;
#define int long long
const int M=5e6+6;
const int inf=9e18;
const int N=1005;
int n,a[N],f[N],ans1,s,t,ans;
int head[M],cnt;
struct node{int to,nxt,w;}e[M];
void add(int u,int v,int w){
e[++cnt].to=v;
e[cnt].nxt=head[u];
e[cnt].w=w;
head[u]=cnt;
}
int deep[M],now[M];
bool bfs(){
for(int i=0;i<M-5;i++)deep[i]=inf;
now[s]=head[s];
deep[s]=0;
queue<int>q;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(e[i].w&&deep[v]==inf){
deep[v]=deep[u]+1;
now[v]=head[v];
q.push(v);
if(v==t)return 1;
}
}
}
return 0;
}
int dfs(int u,int sum){
if(u==t)return sum;
int k,flow=0;
for(int i=head[u];i&∑i=e[i].nxt){
int v=e[i].to;
if(e[i].w&&(deep[v]==deep[u]+1)){
k=dfs(v,min(e[i].w,sum));
if(!k)deep[v]=inf;
e[i].w-=k;
e[i^1].w+=k;
flow+=k;
sum-=k;
}
}
return flow;
}
signed main(){
cin>>n;
if(n==1){cout<<1<<endl<<1<<endl<<1;return 0;}
for(int i=1;i<=n;i++){
cin>>a[i];
f[i]=1;
}
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(a[j]<=a[i])f[i]=max(f[i],f[j]+1);
}
ans1=max(ans1,f[i]);
}
cout<<ans1<<endl;
s=0,t=2*n+1;
for(int i=1;i<=n;i++){
add(i,i+n,1),add(i+n,i,0);
if(f[i]==1){
add(s,i,1),add(i,s,0);
}
else{
if(f[i]==ans1){add(i+n,t,1),add(t,i+n,0);}
for(int j=1;j<i;j++){
if(a[j]<a[i]&&f[j]+1==f[i]){add(j+n,i,1),add(i,j+n,0);}
}
}
}
while(bfs()){
ans+=dfs(s,inf);
}
cout<<ans<<endl;
memset(now,0,sizeof(now));
memset(head,0,sizeof(head));
cnt=0;
for(int i=1;i<=n;i++){
if(i==1||i==n){
add(i,i+n,inf),add(i+n,i,0);
//cout<<i<<" "<<i+n<<" "<<inf<<endl;
if(i==1)add(s,i,inf),add(i,s,0);//cout<<s<<" "<<i<<" "<<inf<<endl;}
if(i==n&&f[i]==ans1)add(i+n,t,inf),add(t,i+n,0);//cout<<i+n<<" "<<t<<" "<<inf<<endl;}
if(i==n)
for(int j=1;j<i;j++){
if(a[j]<a[i]&&f[j]+1==f[i])add(j+n,i,1),add(i,j+n,0);//cout<<j+n<<" "<<i<<endl;
}
}else{
add(i,i+n,1),add(i+n,i,0);//cout<<i<<" "<<i+n<<endl;
if(f[i]==1)add(s,i,1),add(i,s,0);//cout<<s<<" "<<i<<endl;}
else{
if(f[i]==ans1)add(i+n,t,1),add(t,i+n,0);//cout<<i+n<<" "<<t<<endl;}
for(int j=1;j<i;j++){
if(a[j]<a[i]&&f[j]+1==f[i])add(j+n,i,1),add(i,j+n,0);//cout<<j+n<<" "<<i<<endl;}
}
}
}
}
ans=0;
while(bfs()){
ans+=dfs(s,inf);
}
cout<<ans<<endl;
return 0;
}