题目大意:从原队列中取出最少的士兵,让新队列里的任意士兵都能看到队列的最左端或者最右端
输入:士兵个数n(2<=n<=1000)
按编号升序排列的士兵身高h(0.5<=h<=2.5)
输出:需要出列的士兵个数
分析:从左往右求出最长上升子序列l[i](以第i位结尾的最长上升子序列长度)
再从左往右求出最长下降子序列r[i](以第i位开始的最长下降子序列长度)
n减去l[i]+r[j]的最大值即为答案
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
int main(){
int n,ans = 1;
cin >> n;
vector<double> a;
double height;
for(int i = 0;i < n;i++){
cin >> height;
a.push_back(height);
}
vector<int> l(n,1),r(n,1);
for(int i = 1;i < n;i++){
for(int j = 0;j < i;j++){
if(a[i] > a[j])
l[i] = max(l[i],l[j] + 1);
}
}
for(int i = n - 2;i >= 0;i--){
for(int j = i + 1;j < n;j++){
if(a[i] > a[j])
r[i] = max(r[i],r[j] + 1);
}
}
for(int i = 0;i < n - 1;i++)
for(int j = i + 1;j < n;j++)
ans = max(ans,(l[i] + r[j]));
cout << n - ans << endl;
return 0;
}