看了这个题 然后发现用lis做 然后。。。傻×了两次 第一个词是还写了一个lds 突然发现把原来数组reverse一下再lis不就行了么。。。
傻×的第二点 主要的 lis算法 nlogn复杂才能过。以前写过 找了半天才找到 但是又忘了 重新学了一遍。
之后又wa了 因为这次改了数组下标从0 开始 然后 len 什么的都没改 以后直接从1 开始就拉倒了。。
之前写过这个算法了 直接贴代码了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=30005;
int arr[maxn],dp[maxn];
int n;
int LIS()
{
dp[1]=arr[1];
int i,j,low,high,mid,len=1;
for(i=2;i<=n;++i)
{
low=1;high=len;
while(low<=high)
{
mid=(low+high)/2;
if(arr[i]>=dp[mid])
low=mid+1;
else
high=mid-1;
}
dp[low]=arr[i];
if(low>len)
len++;
}
return len;
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;++i)
scanf("%d",&arr[i]);
int a=LIS();
reverse(arr+1,arr+n+1);
int b=LIS();
int ans=n-max(a,b);
printf("%d\n",ans);
}
return 0;
}