原理:
最大上升子序列
此题思路分析:
https://www.bilibili.com/video/BV1qy4y1e7bX?from=search&seid=1474087574309940493
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
int a[105];
int dp1[105];
int dp2[105];
int main(){
int n;
while(cin>>n){
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++){
dp1[i]=1;
for(int j=0;j<=i;j++){
if(a[j]<a[i]){ //求当前元素的最大升序列长度
dp1[i]=max(dp1[i],dp1[j]+1);
}
}
}
for(int i=n-1;i>=0;i--){
dp2[i]=1;
for(int j=n-1;j>=i;j--){
if(a[j]<a[i]) //求当前元素的最大降序列长度
dp2[i]=max(dp2[i],dp2[j]+1);
}
}
int ans=0;
for(int i=0;i<n;i++){
ans=max(ans,dp1[i]+dp2[i]);
}
cout<<n-ans+1<<endl;
}
return 0;
}