模板 - 最长上升/下降子序列(旧)

模板 - 最长上升/下降子序列(旧)

// 返回的是最长上升(非严格)子序列的最大长度  
int lisUpMax(int A[],int n){  
    int maxn = 1;  
    int Ser[n+10]; //Ser[i] 代表 有i位时的最大元素的最小值  

    memset(Ser,0x3f,sizeof(Ser));  

    Ser[1] = A[1];  
    for (int i = 2;i <= n;i ++){  
        // 目标找到第一个严格大于他的数  
        int l = 1,r = maxn;  
        while (l <= r){  
            int m = (l+r)>>1;  
            if (Ser[m] > A[i]) r = m-1; ///如果要改成严格的话就把这个 > 改为 >=   
            else               l = m+1;  
        }  
        if (l == maxn+1){  
            maxn ++;  
        }  

        Ser[l] = A[i];  
    }  

    return maxn;  
}  

// 返回的是最长下降(非严格)子序列的最大长度  
int lisDownMax(int A[],int n){  
    int maxn = 1;  
    int Ser[n+10]; //Ser[i] 代表 有i位时的最大元素的最小值  

    fill(Ser,Ser+n+10,-INF);  

    Ser[1] = A[1];  
    for (int i = 2;i <= n;i ++){  
        // 目标找到第一个严格小于他的数  
        int l = 1,r = maxn;  
        while (l <= r){  
            int m = (l+r)>>1;  
            if (Ser[m] < A[i]) r = m-1; ///如果要改成严格的话就把这个 < 改为 <=   
            else               l = m+1;  
        }  
        if (l == maxn+1) {  
            maxn ++;  
        }  

        Ser[l] = A[i];  
    }  

    return maxn;  
}  

猜你喜欢

转载自blog.csdn.net/qq_41428565/article/details/80195801