您的位置:首页 > 其它

poj 1836 Alignment (LIS)

2011-11-29 18:58 387 查看
http://poj.org/problem?id=1836

题意:从一列士兵中剔除一些,使剩下的符合a1>a2>a3>...>ai ai+1<ai+2<....<aN-1<aN

思路:用了两个LIS分别从前往后和从后往前,得到啊a[],b[],最后取a[i]+b[i]的最大值;

View Code

#include<cstdio>
#include<cstring>
using namespace std;
double s[1010],st[1010];
int a[1010],b[1010],n,rear,temp;
int solve(double t)
{
int l=1,r=rear;
while(l<=r)
{
int mid=(l+r)/2;
if(st[mid]>=t)
r=mid-1;
else
l=mid+1;
}
if(l>rear)
rear=l;
return l;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lf",&s[i]);
rear=0;
for(i=1;i<=n;i++)
{
temp=solve(s[i]);
st[temp]=s[i];
a[i]=rear;
}
rear=0;
for(i=n;i>=1;i--)
{
temp=solve(s[i]);
st[temp]=s[i];
b[i]=rear;
}
int max=0;
for(i=1;i<=n-1;i++)
for(j=1+i;j<=n;j++)
if(a[i]+b[j]>max)
max=a[i]+b[j];
printf("%d\n",n-max);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: