计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入描述:整数N
输出描述:最少需要几位同学出列
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
int n;
while (cin >> n)
{
int tmp;
vector<int> queue;
vector<int> dp_1(n, 1);
vector<int> dp_2(n, 1);
for (int i = 0; i < n; ++i)
{
cin >> tmp;
queue.push_back(tmp);
}
for (int i = 0; i < n; ++i)
{
for (int j = 0; j<i; j++)
{
if (queue[j] < queue[i])
dp_1[i] = max(dp_1[i],dp_1[j] + 1);
}
}
reverse(queue.begin(), queue.end());
for (int i = 0; i < n; ++i)
{
for (int j=0;j<i; j++)
{
if (queue[i] > queue[j])
dp_2[i] = max(dp_2[i],dp_2[j] + 1);
}
}
reverse(dp_2.begin(), dp_2.end());
int max = -1;
int sum;
for (int i = 0; i < n; ++i)
{
sum = dp_1[i] + dp_2[i];
if (sum > max)
{
max = sum;
}
}
cout << n - max + 1 << endl;
}
return 0;
}