UVa 10534 Wavio Sequence

Posted chillilly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 10534 Wavio Sequence相关的知识,希望对你有一定的参考价值。

UVa 10534 Wavio Sequence

链接:https://vjudge.net/problem/UVA-10534

 

思路:

 分别列出每个数列的最长上升子序列(LIS)和最长下降子序列(LDS)

注:LIS(i):以a[i]结尾的最长上升子序列长度 LDS:以a[i]为开头的最长下降子序列长度
如:
数列:1 2 3 4 5 4 3 2 1 10
LIS:  0 1 2 3 4 4 4 4 4 5
LDS:4 4 4 4 4 3 2 1 0 0
其中5 对应的LIS长度为4,LDS长度为4,答案n=min(4,4)=4 N=2*4+1=9
分别比对每个数对应的最长上升子序列长度和最长下降子序列长度中的最小值,选出最大的即可。
注:(1)要求LDS,只需要将数列反向进行一遍LIS即可。 (2) 由于N的范围可能达到10000,LIS:N^2的算法有可能会超时,因此采用了NlogN 的优化算法
AC代码:
#include <bits/stdc++.h> 
using namespace std;
const int N=10000+10;
int a[N],dp[N], lis[N],lds[N];
int main()
{
    int n;
    while (scanf("%d", &n) != EOF){
        for (int i=0;i<n;i++) scanf("%d",&a[i]);
         memset(dp,0,sizeof(dp));
        int pos=0;   
        dp[0]=a[0];lis[0]=0;
        for(int i=1; i<n; i++)
        {
            if(a[i]>dp[pos]) 
                dp[++pos] = a[i];
            else  
                dp[lower_bound(dp,dp+pos+1,a[i])-dp]=a[i];  
            lis[i]=pos;
        }
        memset(dp,0,sizeof(dp));
        pos=0;   
        dp[0]=a[n-1];lds[n-1]=0;
        for(int i=n-1; i>=0; i--)
        {
            if(a[i]>dp[pos]) 
                dp[++pos] = a[i];
            else  
                dp[lower_bound(dp,dp+pos+1,a[i])-dp]=a[i];  
            lds[i]=pos;
        }
        int ans=0;
        for (int i=0;i<n;i++)
            ans=max(ans,min(lis[i],lds[i]));
        printf("%d
",ans*2+1);
    }
    
    return 0;
}

 

 

以上是关于UVa 10534 Wavio Sequence的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp UVa 10534 - Wavio序列

UVA - 10534

UVa 10534 波浪子序列(快速求LIS)

uva 1584.Circular Sequence

UVa 1584 Circular Sequence --- 水题

[DP] UVA-1626 Brackets sequence