由题意可知,我们可以穷举每一个人,假设以他为中心时队列可以具有的最大长度,由于数据范围较小,完全可以直接遍历然后暴算orz;
但我们还是用线性dp来做吧QAQ
dp_l[i]表示以第i个人为中心时其左边矮于他的人数,dp_r[i]表示以第i个人为中心时其右边矮于他的人数。注意二者都不包括第i个人本身,也就是说初始化dp_l[i] = dp_r[i] = 0;
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 105;
int n;
int height[N],dp_l[N],dp_r[N],res[N];
int main() {
cin >> n;
for (int i = 1;i <= n;i++) cin >> height[i];
for (int i = 1;i <= n;i++) {
for (int j = 1;j < i ;j++) {
if (height[i] > height[j])
dp_l[i] = max(dp_l[i],dp_l[j] + 1);
}
}
for (int i = n;i >= 1;i--) {
for (int j = n;j > i;j--) {
if (height[i] > height[j])
dp_r[i] = max(dp_r[i],dp_r[j] + 1);
}
}
int ans = -1e5;
for (int i = 1;i <= n;i++) {
res[i] = dp_l[i] + dp_r[i] + 1;
ans = max(ans,res[i]);
}
cout << n - ans << endl;
return 0;
}