[华为OJ] 合唱团

思路:

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

取数组中第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;      
        }      
    }      
}      


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值