最長増加部分列
数列\(A\)を与えると、\(A\)の最長増加部分列の長さを求め、long longで返す
計算量は\(Ο(\vert A \vert log \vert A \vert)\)
long long LIS(std::vector<long long> A){
// Copyright (c) 2023 0214sh7
// https://github.com/0214sh7/library/
int N=A.size();
std::vector<long long> D;
for(int i=0;i<N;i++){
int pos=distance(D.begin(),lower_bound(D.begin(), D.end(),A[i]));
if(pos==D.size()){
D.push_back(A[i]);
}else{
D[pos]=A[i];
}
}
return D.size();
}
使用例
実行コード
#include <bits/stdc++.h>
long long LIS(std::vector<long long> A){/*省略*/}
int main(void){
std::vector<long long> A={1,4,2,5,3},B={5,3,1,4,2};
std::cout << LIS(A) << std::endl;
std::cout << LIS(B) << std::endl;
return 0;
}
出力
3
2
更新履歴
日時 | 内容 |
---|---|
2023/06/29 | ライセンスのコメントアウトを変更 |
2021/03/26 | 使用例を追加 |
2020/04/05 | 最長増加部分列を追加 |