【题目描述】
N位同学站成一排,音乐老师要请其中的(N−K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设KK位同学从左到右依次编号为1,2,…,K1,2,…,K,他们的身高分别为T1,T2,…,TK,则他们的身高满足T1<T2<…<Ti,Ti>Ti+1>…>TK(1≤i≤K)
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入】
输入的第一行是一个整数N(2≤N≤100),表示同学的总数。第二行有n个整数,用空格分隔,第ii个整数Ti(130≤Ti≤230)是第ii位同学的身高(厘米)。
【输出】
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【输入样例】
8
186 186 150 200 160 130 197 220
【输出样例】
4
【提示】
对于50%的数据,保证有n≤20;
对于全部的数据,保证有n≤100。
#include <iostream>
using namespace std;
int dp_up[101],dp_down[101],a[101],n,ans=0x3f3f3f; //dp_up 最长上升子序列长度 dp_down 最长下降子序列长度
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
dp_up[i]=dp_down[i]=1;
}
for(int i=1;i<=n;i++) //从左到右最长上升子序列长度
for(int j=1;j<i;j++)
if(a[i]>a[j])
dp_up[i]=max(dp_up[i],dp_up[j]+1);
//从右到左最长上升子序列长度 ,注意此题不是求最从左到右下降序列长度
for(int i=n;i>=1;i--)
for(int j=n;j>i;j--)
if(a[i]>a[j])
dp_down[i]=max(dp_down[i],dp_down[j]+1);
for(int i=1;i<=n;i++)
ans=min(n-dp_up[i]-dp_down[i]+1, ans);
cout<<ans;
return 0;
}