刚一开始理解错了题意,当我wa了两次之后,重新思考,发现在队列里的士兵可以从左边或者从右边没有比他高的即可。
由此,此题和合唱队形差不多,求一个最长升序列,以及一个最长下降序列,枚举中间的兵和他左边最长下降序列之和。
时间复杂度为o(n^2)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
double a[1010];
int inc[1010],de[1010];
int main(){
int len;
while(~scanf("%d",&len))
{
for(int i=1;i<=len;i++)
scanf("%lf",&a[i]);
memset(inc,0,sizeof(inc));
memset(de,0,sizeof(de));
for(int i=1;i<=len;i++)
{
for(int j=0;j<i;j++)
{
if(inc[i]<=inc[j]&&a[i]>a[j])
inc[i]=inc[j]+1;
}
}
for(int i=len;i>0;i--)
{
for(int j=i+1;j<=len+1;j++)
{
if(de[i]<=de[j]&&a[i]>a[j])
{
de[i]=de[j]+1;
}
}
}
int ans=0,tem;
for(int i=1;i<=len;i++)
{
tem=i;
for(int j=i+1;j<=len;j++)
{
if(de[tem]<=de[j])
tem=j;
}
if(tem==i)
ans=ans<(de[tem]+inc[i]-1)?(de[tem]+inc[i]-1):ans;
else
ans=ans<(de[tem]+inc[i])?(de[tem]+inc[i]):ans;
}
printf("%d\n",len-ans);
}
return 0;
}