最长上升子序列的变体
t_1 <⋯< t_i > t_(i+1) > … > t_k (1≤i≤k)
只要遍历每个数为中间的最高点,
从开始到该点 最长上升子序列
从该点到结尾 最长下降子序列(我转化为了
从结尾到该点 最长上升子序列)
#include<bits/stdc++.h>
#define go(i,a,b) for(int i=a;i<=b;++i)
#define ll long long
using namespace std;
int dp0[100+10];
int len0[100+10];
int dp1[100+10];
int len1[100+10];
int t[100+10];
int main(){
int n;
cin>>n;
go(i,1,n)scanf("%d",&t[i]);
int tail=1;
dp0[1]=t[1];
go(i,1,n){
if(t[i]>dp0[tail]){
dp0[++tail]=t[i];
len0[i]=tail;
}
else{
int k=lower_bound(dp0+1,dp0+(tail+1),t[i])-dp0;
dp0[k]=t[i];
len0[i]=k;
}
}
tail=1;
dp1[1]=t[n];
for(int i=n;i>=1;--i){
if(t[i]>dp1[tail]){
dp1[++tail]=t[i];
len1[i]=tail;
}
else{
int k=lower_bound(dp1+1,dp1+(tail+1),t[i])-dp1;
dp1[k]=t[i];
len1[i]=k;
}
}
int in=0;
go(i,1,n)in=max(in,len0[i]+len1[i]-1);
cout<<n-in;
return 0;
}