最长**子序列O(nlogn)解法

最长**子序列$O(nlog_n)$解法

实现原理

最长上升子序列

int _1() {
    int up_sum=0;
    for(int i=1; i<=n; i++) {
        if(a[i] > F_up[up_sum]) {
            F_up[++up_sum]=a[i];
        } else {
            F_up[upper_bound(F_up,n,a[i])]=a[i];
        }
    }
    return up_sum;
}

最长不下降子序列

int _2() {
    int up_sum=0;
    for(int i=1; i<=n; i++) {
        if(a[i] >= F_up[up_sum]) {
            F_up[++up_sum]=a[i];
        } else {
            F_up[upper_bound(F_up,n,a[i])]=a[i];
        }
    }
    return up_sum;
}

最长下降子序列

int _3() {
    int down_sum=0;
    F_down[++down_sum]=a[1];
    for(int i=2; i<=n; i++) {
        if(a[i] < F_down[down_sum]) {
            F_down[++down_sum]=a[i];
        } else {
            F_down[lower_bound(F_down,down_sum,a[i])]=a[i];
        }
    }
    return down_sum;
}

最长不上升子序列

int _4() {
    int down_sum=0;
    F_down[++down_sum]=a[1];
    for(int i=2; i<=n; i++) {
        if(a[i] <= F_down[down_sum]) {
            F_down[++down_sum]=a[i];
        } else {
            F_down[lower_bound(F_down,down_sum,a[i])]=a[i];
        }
    }
    return down_sum;
}
posted @ 2019-01-28 11:13  加固文明幻景  阅读(5)  评论(0编辑  收藏  举报  来源