描述
解析
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> vec(n,0);
for (int i = 0; i < n; ++i) {
cin >> vec[i];
}
vector<int> up(n,1);
vector<int> down(n,1);
// 最长上升子序列
for (int i = 1; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (vec[j] < vec[i]) {
up[i] = max(up[i],up[j]+1);
}
}
}
// 最长下降子序列
for (int i = n-2; i >= 0; --i) {
for (int j = n-1; j > i; --j) {
if (vec[i] > vec[j]) {
down[i] = max(down[i],down[j]+1);
}
}
}
int ans = 0;
for (int i = 0; i < n; ++i) {
ans = max(ans,down[i]+up[i]-1);
}
// 排除n-ans个
cout << n - ans ;
return 0;
}
思路:分别求出最长上升子序列up[i]
和最长下降子序列down[i]
,down[i]+up[i]-1
是位置i满足条件的合唱队长度,找到max,n-max
即为最少的出列同学数目。