记录每个人左边的最大升序列中的人数(注意:他自己也算一个并且身高严格递增),记录每个人右边的最大严格降序列的人数,也包括他自己。
然后代码中有第二种身高序列的处理。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<cmath>
using namespace std;
#define N 1005
int up[N],down[N];
double Arr[N];
int main()
{
int n=0,i=0,j=0,maxn=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lf",&Arr[i]);
}
for(i=0;i<n;i++)
{
up[i]=down[i]=1;
}
for(i=1;i<n;i++)
{
maxn=0;
for(j=0;j<i;j++)
{
if(Arr[j]<Arr[i]&&up[j]>maxn)
{
maxn=up[j];
}
}
up[i]=maxn+1;
}
for(i=n-1;i>=0;i--)
{
maxn=0;
for(j=i+1;j<n;j++)
{
if(Arr[j]<Arr[i]&&down[j]>maxn)
{
maxn=down[j];
}
}
down[i]=maxn+1;
}
int tmp=0;
for(i=0;i<n-1;i++)//通过改变切割点来划分需要的减少最少的点
{
for(j=i+1;j<n;j++)
{
if(up[i]+down[j]>tmp)
{
tmp=up[i]+down[j];
}
}
}
printf("%d\n",n-tmp);
return 0;
}