我们要去掉K个人最后形成一个从两端分别递增的向下开口的排列形状,可以分别枚举每个点,从两端分别找到到该点的最长上升子序列,除去这些人其余的都是需要出队的人,符合条件的人数为res = f[i]-g[i]+1(最大的)。最后用总人数 n - res
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110;
int a[N];
int f[N], g[N];
int main()
{
int n;
cin >> n; // 总共n个人
for(int i = 0;i < n;i++) cin >> a[i];
for(int i = 0; i < n;i++)
{
f[i] = 1;
for(int j = 0;j < i;j++)
if(a[j] < a[i]) f[i] = max(f[i],f[j] + 1);
}
for(int i = n - 1; i >= 0;i--)
{
g[i] = 1;
for(int j = n - 1; j > i;j--) // j在i的右边
{
if(a[i] > a[j]) g[i] = max(g[i],g[j] + 1);
}
}
int res = 0;
for(int i = 0;i < n;i++)
{
res = max(res,f[i]+g[i]-1);
}
cout << (n-res) << endl;
return 0;
}