가장 긴 증가하는 부분 수열 (LIS) - 2
- LIS 배열 구하기
- 백준 2568 전깃줄 - 2
- 백준 2550 전구
#include <iostream>
#include <limits.h>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
int A[1001] = { 0 };
cin >> n;
for (int i = 0; i < n; i++)
cin >> A[i];
vector <int> vt;
vector <int> record;
vector <int> ret;
// record 벡터에 A[i]가 vt벡터에 저장되는 위치 저장
int idx = 0;
vt.push_back(A[0]);
record.push_back(0);
for (int i = 1; i < n; i++) {
if (vt.back() < A[i]) {
vt.push_back(A[i]);
record.push_back(++idx);
}
else {
auto it = lower_bound(vt.begin(), vt.end(), A[i]);
*it = A[i];
record.push_back(it-vt.begin());
}
}
// lis 추적
int flag = idx;
for (int i = n-1 ; i >= 0; i--) {
if (record[i] == flag) {
ret.push_back(A[i]);
flag--;
}
if (flag == -1)
break;
}
reverse(ret.begin(), ret.end());
for (auto it = ret.begin(); it != ret.end(); it++)
cout << *it << " ";
cout << "\n";
return 0;
}
upper_bound, lower_bound 의 인덱스
https://www.crocus.co.kr/913
이터레이터를 반환받지 않고 인덱스를 반환 받기 위해서는
lower_bound( ~ ) - vector.begin()
upper_bound( ~ ) - vector.begin()
벡터 역순 저장
https://starrykss.tistory.com/597
LIS 추적
https://yhwan.tistory.com/21