题目
思路
代码
#include <stdio.h>
int main() {
int n, a[3000], lift[3000], right[3000], max = 0;
scanf("%d",&n);
for (int i = 0; i < n; i++){
scanf("%d",&a[i]);
}
/*计算每一个位置的最长递增序列*/
for (int i = 0; i < n; i++){
lift[i] = 1;//将每一个元素初始化为1表示当前最长递增序列为1
for (int j = 0; j < i; j++){
if (a[i] > a[j]){
//如果当前的值大于之前的值,就对比一下之前的值加1的元素个数多还是当前的值之前遍历的元素个数多
lift[i]=lift[j]+1>lift[i]?lift[j]+1:lift[i];
}
}
}
/*计算每一个位置的最长递减序列*/
for (int i = n-1; i >=0; i--){
right[i] = 1;//将每一个元素初始化为1表示当前最长递减序列为1
for (int j = n-1; j >i; j--){
if (a[i] > a[j]){
//i位置的身高高于j位置的身高,就计算一下是当前i位置统计的人数多还是j位置加上i位置的这个人以后的人多
right[i]=right[j]+1>right[i]?right[j]+1:right[i];
}
}
}
//将做递增和右边递减加到一块计算每一个位置可以变成队列的最好人数
for (int i = 0; i < n; i++){
a[i]=lift[i]+right[i]-1;
if(max<a[i])max=a[i];//统计形成队列的最多人数
}
printf("%d\n",n-max);
}