POJ 1836 Alignment
题目大意:
给定一排人的身高,求踢出最少的人可以使队列身高如下形状:
(感谢大神提供图片)
这个题比较简单,顺序一遍最长上升子序列,逆序一遍最长上升子序列,最后处理一下数据就行。
下面是代码:
#include <stdio.h> #include <string.h> const int MAX=1005; int main() { int n,dpl[MAX],dpr[MAX]; double hi[MAX]; while(scanf("%d",&n)!=EOF) { int i,j; for(i=0; i<n; i++) { scanf("%lf",&hi[i]); } memset(dpr,0,sizeof(dpr)); memset(dpl,0,sizeof(dpl)); dpl[0]=1; for(i=1;i<n;i++) { dpl[i]=1; for(j=i-1;j>=0;j--) { if(hi[j]<hi[i]&&dpl[j]+1>dpl[i]) { dpl[i]=dpl[j]+1; } } } dpr[n-1]=1; for(i=n-2;i>=0;i--) { dpr[i]=1; for(j=i+1;j<=n-1;j++) { if(hi[j]<hi[i]&&dpr[j]+1>dpr[i]) { dpr[i]=dpr[j]+1; } } } int ans=dpl[n-1]; for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { if(dpl[i]+dpr[j]>ans) { ans=dpl[i]+dpr[j]; } } } printf("%d\n",n-ans); } return 0; }