| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 13590 | Accepted: 4375 |
Description
Input
Output
Sample Input
8 1.86 1.86 1.30621 2 1.4 1 1.97 2.2
Sample Output
4
Source
//172K 297MS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
double tail[1007],dp[1007],s[1007];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int maxx=-1;
for(int i=1;i<=n;i++)
scanf("%lf",&tail[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<n;i++)//枚举中间点
{
//求1到i的最长上升子序列
dp[1]=tail[1];
int low,high,mid,len=1;
for(int j=2;j<=i;j++)
{
low=1;high=len;
while(low<=high)
{
mid=(low+high)>>1;
if(dp[mid]<tail[j])low=mid+1;
else high=mid-1;
}
dp[low]=tail[j];
if(low>len)len++;
}
//求i+1到n的最长下降子序列
memset(dp,0,sizeof(dp));
memset(s,0,sizeof(s));
int k=0,len2=1;
for(int j=n;j>i;j--)//倒序一下
s[++k]=tail[j];
dp[1]=s[1];
for(int j=2;j<=k;j++)//倒着求最长上升子序列
{
low=1;high=len2;
while(low<=high)
{
mid=(low+high)>>1;
if(dp[mid]<s[j])low=mid+1;
else high=mid-1;
}
dp[low]=s[j];
if(low>len2)len2++;
}
if(len+len2>maxx)maxx=len+len2;
}
printf("%d\n",n-maxx);
}
return 0;
}
POJ 1836 Alignment 枚举中间点双向求LIS
原文:http://blog.csdn.net/crescent__moon/article/details/43115059