// 返回的是最长上升(非严格)子序列的最大长度
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;
}
最长上升子序列模板
最新推荐文章于 2024-02-26 14:37:27 发布