本题考察点:线性dp
本人思路:首先,由题可得,队列将被分为由小到大和由大到小两部分,那么可以对原数组进行两次dp操作,分别求出向上最长队和向下最长队,再枚举最高点,求出队列最长值后用总长减则得到需要出列得长度。
/**
* step1:输入
* step2:从头开始的最长上升子序列
* step3:从尾开始的最长上升子序列
* step4:求出答案。
* 时间复杂度:O(n^2)
*/
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n;
int a[N],f[N],g[N];
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
f[i]=1;
for(int j=1;j<=i;j++){
if(a[i]>a[j])f[i]=max(f[i],f[j]+1);
}
}
for(int i=n;i>0;i--){
g[i]=1;
for(int j=n;j>=i;j--){
if(a[i]>a[j])g[i]=max(g[i],g[j]+1);
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,f[i]+g[i]-1);
}
cout<<(n-ans)<<endl;
return 0;
}
/**
* 至少5个不同类型的样例
* 样例1:1 2 3 4 5
* 样例2:1 4 3 2 5
* 样例3:5 4 3 2 1
* 样例4:1 2 3 4 5 1 2 3 4 5
* 样例5:5 4 4 4 5
*/