最长非下降子序列
#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:将原序列逆序储存,然后求一遍最长非下降子序列