poj 1836 Alignment (LIS)

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>
#include<algorithm>
using namespace std;
double s[1010];
int n,a[1010],b[1010],i,j;
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lf",&s[i]);
a[1]=1;
for(i=2;i<=n;i++)
{
a[i]=1;
for(j=1;j<i;j++)
if(s[i]>s[j]&&a[j]>=a[i])
a[i]=a[j]+1;
}
b[n]=1;
for(i=n-1;i>=1;i--)
{
b[i]=1;
for(j=n;j>i;j--)
if(s[i]>s[j]&&b[j]>=b[i])
b[i]=b[j]+1;
}
int max=1;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i]+b[j]>max)
max=a[i]+b[j];
printf("%d\n",n-max);
return 0;
}
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;
}




posted @ 2011-11-29 18:58  LT-blogs  阅读(154)  评论(0编辑  收藏  举报