思路:
看作最長升序子序列和最長降序子序列的拼接。
取數組中第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;
}
}
}