¿ªÊ¼µÄʱºòÒ»Ö±Ïë²»µ½Ò»¸öºÏÊʵÄ×´Ì¬×ªÒÆ·½³Ì£»
ºóÃæÏëµ½¿ÉÒÔ·Ö±ðÇóÒÔÖмäÄǸöÊýΪÖÕµãºÍÆðµãµÄ×ÉÏÉý×ÓÐòÁеij¤¶È£¬
È»ºóÒÔÕâ¸öÊýΪÖÐÐÄÊýµÄWavio SequenceµÄ³¤¶È¾ÍÊÇÆäÖж̵ÄÄǸöÖµ*2-1µÄÖµ£»
È»ºóÎÒÃÇÈ¡ËùÓÐÊýWavio SequenceµÄ×î´ó³¤¶È×÷Ϊ´ð°¸¡£
Õâ¸öÌâÄ¿¿¨ÁËn^2µÄÇó×ÉÏÉý×ÓÐòÁеÄËã·¨£¬±ØÐëÓÃnlgnËã·¨²ÅÄܹý¡£
´úÂëÈçÏ£º
#include
#include
#include
#include
using namespace std; int a[10010],n; int d1[10010],d2[10010]; int d[10010]; int lower_bound(int* A,int x,int y,int v) { int m; while(x
=v) y=m; else x=m+1; } return x; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) d1[i]=1,d2[i]=1; int len=1; d[1]=a[1]; for(int i=2;i<=n;i++) { if(a[i]>d[len]) { d[++len]=a[i]; d1[i]=len; } else { int t=lower_bound(d,1,len,a[i]); d[t]=a[i]; d1[i]=t; } } len=1; d[1]=a[n]; for(int i=n-1;i>=1;i--) { if(a[i]>d[len]) { len++; d[len]=a[i]; d2[i]=len; } else { int t=lower_bound(d,1,len,a[i]); d[t]=a[i]; d2[i]=t; } } int ans=0; for(int i=1;i<=n;i++) ans=max(ans,min(d1[i],d2[i])*2-1); printf("%d\n",ans); } return 0; }