#include <iostream>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int dp[n],r_dp[n];
for(int i=0;i<n;i++)
{
dp[i] = 1;
for(int j=0;j<i;j++)
if(a[j] < a[i])
dp[i] = max(dp[i],dp[j]+1);
}
for(int i=n-1;i>=0;i--)
{
r_dp[i] = 1;
for(int j=n-1;j > i;j--)
if(a[j] < a[i])
r_dp[i] = max(r_dp[i],r_dp[j]+1);
}
int Max = 0;
for(int i=0;i<n;i++)
{
Max = max(Max,dp[i]+r_dp[i]-1);
}
cout<<n-Max<<endl;
return 0;
}
分别算从0开始和从n-1开始的最长上升序列,然后再往后枚举一个最中间的人,
通过dp[i] + r_dp[i] - 1算的该人前后的最大存在人数(减1是因为a[i]这个人一定在队中,然后dp,rdp各算了一次)