最长非下降子序列,最长非上升子序列 nlogn

 最长非下降子序列

#include <bits/stdc++.h>

using namespace std;

const int maxn = 100010;
int a[maxn], ans[maxn]; ///a[] 储存序列。ans储存最长上升序列
int n;                  ///n为序列长度

int main() {
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    int pans = 1, j;          ///pans 代表长度
    ans[0] = a[0];          ///初始化
    for(int i = 1; i < n; i++) {
        if(a[i] >= ans[pans - 1])
            ans[pans ++] = a[i];
        else {
            j = upper_bound(ans, ans + pans, a[i]) - ans; ///返回ans中第一个 >= a[i] 的位置,  ///lower_bound() 返回地址
            ans[j] = a[i];
        }
    }
    printf("%d\n", pans);
    return 0;
}

最长非上升子序列

1:将原序列逆序储存,然后求一遍最长非下降子序列

猜你喜欢

转载自blog.csdn.net/no_O_ac/article/details/82253909