Wavio Sequence UVA - 10534

题解:dp[ i ]表示以a[ i ]为末尾的上升子序列。然后顺序跑一遍LIS,逆序跑一遍LIS。不要用O(n*n)的算法
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 7 const int INF=1e8; 8 const int maxn=10005; 9 10 int n; 11 int a[maxn],b[maxn],dp1[maxn],dp2[maxn]; 12 13 void Inite(){ 14 memset(dp1,0,sizeof(dp1)); 15 memset(dp2,0,sizeof(dp2)); 16 } 17 18 void solve(){ 19 for(int i=0;i<=n;i++) b[i]=INF; 20 for(int i=0;i<n;i++){ 21 dp1[i]=lower_bound(b,b+n,a[i])-b; //书上的写法是 *lower_bound(dp,dp+n,a[i])=a[i]; 22 b[dp1[i]]=min(b[dp1[i]],a[i]); //相同的思想,只是稍微改一下!!!! 23 } 24 25 for(int i=0;i<=n;i++) b[i]=INF; 26 for(int i=n-1;i>=0;i--){ 27 dp2[i]=lower_bound(b,b+n,a[i])-b; 28 b[dp2[i]]=min(b[dp2[i]],a[i]); 29 } 30 31 int ans=0; 32 for(int i=0;i<n;i++) ans=max(ans,min(dp1[i],dp2[i])); 33 ans=2*ans+1; 34 cout<<ans<<endl; 35 } 36 37 int main() 38 { while(scanf("%d",&n)!=EOF){ 39 for(int i=0;i<n;i++) scanf("%d",&a[i]); 40 Inite(); 41 solve(); 42 } 43 return 0; 44 }

浙公网安备 33010602011771号