題意:有一個隊軍人排成一排,但是高矮並不安順序。爲了使這個隊伍中的任意一個人都可以看到左端或右端,需要讓幾個人出列。給你一個隊列求最少需要出列的人的個數。
思路:因爲需要看到隊伍的最左端或者最右端這就需要隊伍自左向右身高的遞增的或者自右向左遞增。(注意題目描述與實際要求有出入,題目要求是看到端點的人,而題意爲看到隊伍物理上的最左或右端,即最左邊人的左邊爲左端,相反也是)所以該題可以用最長上升子序列的思路,兩個方向求出最長上升子序列數組,然後枚舉所有符合題意的情況,找到隊伍中人數最多的那一種。最後與總人數的差值就是解。
#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;
}