题意:有一个队军人排成一排,但是高矮并不安顺序。为了使这个队伍中的任意一个人都可以看到左端或右端,需要让几个人出列。给你一个队列求最少需要出列的人的个数。
思路:因为需要看到队伍的最左端或者最右端这就需要队伍自左向右身高的递增的或者自右向左递增。(注意题目描述与实际要求有出入,题目要求是看到端点的人,而题意为看到队伍物理上的最左或右端,即最左边人的左边为左端,相反也是)所以该题可以用最长上升子序列的思路,两个方向求出最长上升子序列数组,然后枚举所有符合题意的情况,找到队伍中人数最多的那一种。最后与总人数的差值就是解。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int n,i,j;
double arr[1010];
int len1[1011],len2[1011];
int sum,maxx,maxn;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lf",&arr[i]);
}
len1[0]=1;
for(i=1;i<n;i++)
{
maxn=0;
for(j=0;j<i;j++)
{
if(arr[i]>arr[j]&&len1[j]>maxn)
maxn=len1[j];
}
len1[i]=maxn+1;
}
len2[n-1]=1;
for(i=n-2;i>=0;i--)
{
maxn=0;
for(j=i+1;j<n;j++)
{
if(arr[i]>arr[j]&&len2[j]>maxn)
maxn=len2[j];
}
len2[i]=maxn+1;
}
maxx=0;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(len1[i]+len2[j]>maxx)
maxx=len1[i]+len2[j];
}
}
printf("%d\n",n-maxx);
return 0;
}