처음에는 그냥 점화식있는 DP인줄 알았지만, 최장 증가 수열 문제이다.
근데 내가 구현할 수 있는 최장 증가 수열은 O(N^2)의 시간복잡도를 가져서 예전에 풀었던 코드를 적용할 수가 없었다.
(이문제의 n은 100000)
그래서 어쩔수 없이 시간복잡도가 더 좋은 최장 증가수열 알고리즘을 참고를 했다.
최장 증가 부분 수열 - 나무위키 (namu.wiki)
위키긴 하지만, 동작 원리 참고하여 구현하기 충분했다.
아래는 내 제출 코드이다.
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n; scanf("%d",&n);
vector<int> lis;
for(int i=0;i<n;i++){
int t;scanf("%d",&t);
int idx = lower_bound(lis.begin(), lis.end(), t) - lis.begin();
if(idx >= lis.size()) {
lis.push_back(t);
}
if(lis[idx] > t) {
lis[idx] = t;
}
}
printf("%ld\n",n-lis.size());
}
'알고리즘' 카테고리의 다른 글
BOJ 17142 다리 만들기 2 (0) | 2021.04.07 |
---|---|
BOJ 17143 낚시왕 (0) | 2021.04.05 |
BOJ 1655 가운데를 말해요 (0) | 2021.03.30 |
BOJ 2169 로봇 조종하기 (0) | 2021.03.29 |
BOJ 2887 행성 터널 (0) | 2021.03.28 |