如果熟悉LIS问题,这题基本上可以说是水题了。稍微改了点。相同可以认为是上升的。然后就是正反求最长上升子序列。
代码:
#include<stdio.h>
#include<string.h>
int dp[30010],N;
int a[30010],b[30010];
int search(int n,int m)
{
int i=1,j=n,mid;
while(i<=j)
{
mid=(i+j)>>1;
if(m=>dp[mid]) i=mid+1;//就是少了个等于号,坑了很久!还以为是自己写错了。
else j=mid-1;
}
return i;
}
int count(int *p)
{
int k=1,j,i;
// memset(dp,0,sizeof(dp));
dp[1]=p[1];
for(i=2;i<=N;i++)
{
if(p[i]>=dp[k])
dp[++k]=p[i];
else
{
j=search(k,p[i]);
dp[j]=p[i];
}
}
return k;
}
int main()
{
while(scanf("%d",&N)!=EOF)
{
for(int i=1;i<=N;i++)
{
scanf("%d",&a[i]);
b[N-i+1]=a[i];
}
int len=count(b);
int ans=count(a);
len=len>ans?len:ans;
printf("%d\n",N-len);
}
return 0;
}