说明:
N 位同学站成一排,音乐人要请其中的 (N - K) 位同学出列,使得剩下的 K 位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为 1,2,.,K ,他们的身高分别为 T1,T2, .,TK , 则他们的身高满足存在 i (1<=i<=K) 使得 T1<T2<.<Ti-1Ti+1>.>TK 。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
注意:不允许改变队列元素的先后顺序 且 不要求最高同学左右人数必须相等
请注意处理多组输入输出!
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void calIncSub(vector<int> quene, vector<int> &Num){
for(int i=1;i<quene.size();i++)
for(int j=i-1;j>=0;j--)
if(quene[j]<quene[i] && Num[i]<Num[j]+1) //找到前面比当前小的,且【能获得的最大子串计数】
Num[i]=Num[j]+1;
}
int main(){
int n;
int h;
while(cin>>n){
vector<int> quene;
vector<int> incNum(n,1); //初始化为n个1
vector<int> decNum(n,1);
vector<int> totalNum;
for(int i=0;i<n;i++){
cin >> h;
quene.push_back(h);
}
calIncSub(quene,incNum); //找递增子串计数
reverse(quene.begin(),quene.end()); //翻转,即找反向的子串计数
calIncSub(quene,decNum);
reverse(decNum.begin(),decNum.end()); //反向递增即正向递减
int max=0;
for(int i=0;i<n;i++){
totalNum.push_back(incNum[i]+decNum[i]);
if(totalNum[i]>max)
max=totalNum[i];
}
cout << n-max+1 <<endl;
}
return 0;
}