合唱队形
描述
�N 位同学站成一排,音乐老师要请其中的(�N−�K)位同学出列,使得剩下的 �K 位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为11,22,…,�K,他们的身高分别为�1T1,�2T2,…,��TK,则他们的身高满足�1<�2<T1<T2<… <��,��>��+1><Ti,Ti>Ti+1>…>��(1≤�≤�)>TK(1≤i≤K)。你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入
输入的第一行是一个整数 �N (2≤�≤1002≤N≤100),表示同学的总数。
第二行有 �n 个整数,用空格分隔,第 �i 个整数 ��Ti(130≤��≤230130≤Ti≤230)是第 �i 位同学的身高(厘米)。
输出
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
输入样例 1
8 186 186 150 200 160 130 197 220
输出样例 1
4
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> heights(N), dp_left(N, 1), dp_right(N, 1);
for (int i = 0; i < N; ++i) {
cin >> heights[i];
}
for (int i = 0; i < N; ++i) {
for (int j = 0; j < i; ++j) {
if (heights[j] < heights[i]) {
dp_left[i] = max(dp_left[i], dp_left[j] + 1);
}
}
}
for (int i = N - 1; i >= 0; --i) {
for (int j = N - 1; j > i; --j) {
if (heights[j] < heights[i]) {
dp_right[i] = max(dp_right[i], dp_right[j] + 1);
}
}
}
int max_length = 0;
for (int i = 0; i < N; ++i) {
max_length = max(max_length, dp_left[i] + dp_right[i] - 1);
}
cout << N - max_length << endl;
return 0;
}