poj1836
最长单调子序列,看清题意,从左边求上升,从右边求下降,然后相加,注意中间两个点的高度可以相同(练手)
#include <stdio.h> #include <string.h> #define max(a,b) ((a)>(b)?true:false) double a[1001]; int l[1001],h[1001],s[1001]; int n; int main() { while(scanf("%d",&n)==1) { memset(l,0,sizeof(l)); memset(h,0,sizeof(h)); for(int i=0;i<n;++i) scanf("%lf",&a[i]); for(int i=0;i<n;++i) { for(int j=0;j<i;++j) if(a[j]<a[i]&&max(l[j],l[i])) l[i]=l[j]; ++l[i]; } for(int i=n-1;i>=0;--i) { for(int j=n-1;j>i;--j) if(a[j]<a[i]&&max(h[j],h[i])) h[i]=h[j]; ++h[i]; } int max=0; for(int i=0;i<n;++i) { s[i]=l[i]+h[i]-1; for(int j=i+1;j<n;++j) if(a[i]==a[j]) { if(s[i]<(l[i]+h[j])) s[i]=l[i]+h[j]; else break; } if(max<s[i]) max=s[i]; } printf("%d\n",n-max); } return 0; }