用递归会超时,加多个辅助数组来存各个学生之前比他小的人数,每求一个学生就遍历他前面的学生,求出最大值+1; 为了程序简单,将学生身高按反方向存多一次,也用辅助数组求出各个学生之前比他小的人数,记得在求结果时减去反方向的数组值。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a[105], b[105], aa[105], bb[105];
int main()
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%d", &a[i]);
b[n - 1 - i] = a[i];
}
memset(aa, 0, sizeof(aa));
memset(bb, 0, sizeof(bb));
for(int i = 0; i < n; ++i){
int tmp = -1;
for(int j = i - 1; j >= 0; --j){
if(a[j] < a[i]){
tmp = max(tmp, aa[j]);
}
}
if(tmp != -1){
aa[i] = tmp + 1;
}
}
for(int i = 0; i < n; ++i){
int tmp = -1;
for(int j = i - 1; j >= 0; --j){
if(b[j] < b[i]){
tmp = max(tmp, bb[j]);
}
}
if(tmp != -1){
bb[i] = tmp + 1;
}
}
int ans = 0x7fffffff;
for(int i = 0; i < n; ++i){
ans = min(ans, n - (aa[i] + bb[n - 1 - i] + 1));
}
printf("%d", ans);
return 0;
}