思路:
看作最长升序子序列和最长降序子序列的拼接。
取数组中第i个人为合唱团最高的人,则组成合唱队人数为,队列首到位置i 的最长上升子序列长度 + 从位置 i 到队尾的最长下降子序列长度。
代码:
#include <iostream>
#include <vector>
using namespace std;
void getLs(vector<int> nums, int size, vector<int>& ls);
void getRs(vector<int> nums, int size, vector<int>& rs);
void main(){
int size;
cin >> size;
if(size == 0 || size == 1) cout << 0;
vector<int> input(size,0);
for(int i = 0; i < size; i++){
cin >> input[i];
}
vector<int> ls(size,1);
vector<int> rs(size,1);
getLs(input,size,ls);
getRs(input,size,rs);
int t = 0, index = 0;
for(int i = 1; i < size; i++){
if(ls[i] + rs[i] > t){
t = ls[i] + rs[i];
index = i;
}
}
cout << size - ls[index] - rs[index] + 1;
}
void getLs(vector<int> nums, int size, vector<int>& ls){
for(int i = 1; i < size; i++){
for(int j = 1; j < i; j++){
if(nums[j] < nums[i] && ls[j] + 1 > ls[i])
ls[i] = ls[j] + 1;
}
}
}
void getRs(vector<int> nums, int size, vector<int>& rs){
for(int i = size - 1; i >= 1; i--){
for(int j = size - 1; j >= i; j--){
if(nums[i] > nums[j] && rs[j] + 1 > rs[i])
rs[i] = rs[j] + 1;
}
}
}