您的位置:首页 > 其它

[华为OJ] 合唱团

2016-07-06 09:25 309 查看
思路:

看作最长升序子序列和最长降序子序列的拼接。

取数组中第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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: