UVa10534 Wavio Sequence

来源:互联网 发布:程序员 刷题 哪个好 编辑:程序博客网 时间:2024/04/30 01:59

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1475

题目大意:

给定一串数字,求一个子串满足一下要求:子串的长度是L=2*n+1,前n+1个数字是严格的递增序列,后n+1个数字是严格的递减序列,例如123454321就是满足要求的一个子串,输出满足要求的最长的L,

思路:就是从头到尾求一遍lis,然后再从尾到头求一遍lis。这里可以用一个两个数组来分别保存从前到后和从后到前的相应位置的最长字串的的长度。
#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>using namespace std;int a1[100005],b1[100005],a2[100005],b2[100005];int st[100005];int dp[100005];int n,len1,len2;void solve(){int i,j;st[1]=a1[1];b1[1]=1;for(i=2;i<=n;i++){if(a1[i]>st[len1])j=++len1;else{int le=0;int ri=len1;while(le<ri){int mid=(le+ri)/2;if(st[mid]>=a1[i])ri=mid;elsele=mid+1;}j=le;}st[j]=a1[i];b1[i]=j;}/*printf("len1=%d\n",len1);for(i=1;i<=len1;i++){printf("%d ",st[i]);}printf("\n");*/st[1]=a2[1];b2[1]=1;for(i=2;i<=n;i++){if(a2[i]>st[len2]){j=++len2;}else{int le=0;int ri=len2;while(le<ri){int mid=(le+ri)/2;if(st[mid]>=a2[i])ri=mid;elsele=mid+1;}j=le;}st[j]=a2[i];b2[i]=j;}/*printf("len2=%d\n",len2);for(i=1;i<=len2;i++){printf("%d ",st[i]);}printf("\n");*/}int main(){while(scanf("%d",&n)!=EOF){int i,j;memset(dp,0,sizeof(dp));for(i=1,j=n;i<=n;i++,j--){scanf("%d",&a1[i]);a2[j]=a1[i];b2[i]=b1[i]=0;}len1=len2=1;solve();int ans=0;for(i=1,j=n;i<=n;i++,j--){ans=max(ans,min(b1[i],b2[j])*2-1);}printf("%d\n",ans);}}

0 0
原创粉丝点击