您的位置:首页 > 其它

poj 1836 Alignment

2014-01-17 16:10 246 查看
题目链接:http://poj.org/problem?id=1836

题目大意:将一队人的身高构成三角形,类似于1 2 3 2 1这样的,但是1 2 2 1也可以,方法就是分别从两侧进行dp求最长升序子序列,然后求最长的。。

AC代码:#include<stdio.h>
double h[1005],tall[1005],shor[1005],r[1005],l[1005];
int main()
{
int i,n,a,b=1,j,c;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lf",&h[i]);
tall[0]=h[0];r[0]=l[n-1]=1;
for(i=1;i<n;i++){
for(a=0;a<b;a++){
if(tall[a]>=h[i]){
tall[a]=h[i];
break;
}
}
if(a==b)tall[b++]=h[i];
r[i]=b;
}
c=b;b=1;
shor[0]=h[n-1];
for(i=n-2;i>=0;i--){
for(a=0;a<b;a++){
if(shor[a]>=h[i]){
shor[a]=h[i];
break;
}
}
if(a==b)shor[b++]=h[i];
l[i]=b;
}
int maxn=l[n-1];
for(i=0;i<n;i++)
if(r[i]+l[i+1]>maxn)maxn=r[i]+l[i+1];
printf("%d",n-maxn);
return 0;
}
开的数组貌似有点多。。。

AC截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm poj dp