最长非下降子序列
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int p[maxn], tmp[maxn]; ///p[] 储存序列。tmp储存最长上升序列
int pos[maxn]; ///还原路径所用
int n; ///n为序列长度
int LIS(){
for(i = 0;i < n + 5;++ i){
pos[i] = 0;
}
pt = 0;
for(i = 1;i <= n;++ i){
if(!pt || tmp[pt] < p[i]){
tmp[++ pt] = p[i];
pos[i] = pt;
}
else {
int j = lower_bound(tmp + 1,tmp + 1 + pt,p[i]) - tmp;
tmp[j] = p[i];
pos[i] = j;
}
}
int minn = 999999999,len = pt;
for(i = n;i > 0;-- i){ /// 路径还原
if(!len) break;
if(pos[i] == len && minn > p[i]){ /// 满足该 if,i便是其中一个
-- len;
minn = p[i];
}
}
return pt;
}
最长非上升子序列
1:将原序列逆序储存,然后求一遍最长非下降子序列