1365번: 꼬인 전깃줄
첫 줄에 전봇대의 개수 N(1 ≤ N ≤ 100,000)이 주어지고, 이어서 N보다 작거나 같은 자연수가 N개 주어진다. i번째 줄에 입력되는 자연수는 길 왼쪽에 i번째 전봇대와 연결된 길 오른편의 전봇대가
www.acmicpc.net
처음에는 그냥 점화식있는 DP인줄 알았지만, 최장 증가 수열 문제이다.
근데 내가 구현할 수 있는 최장 증가 수열은 O(N^2)의 시간복잡도를 가져서 예전에 풀었던 코드를 적용할 수가 없었다.
(이문제의 n은 100000)
그래서 어쩔수 없이 시간복잡도가 더 좋은 최장 증가수열 알고리즘을 참고를 했다.
최장 증가 부분 수열 - 나무위키 (namu.wiki)
최장 증가 부분 수열 - 나무위키
어떤 임의의 수열이 주어질 때, 이 수열에서 몇 개의 수들을 제거해서 부분수열을 만들 수 있다. 이때 만들어진 부분수열 중 오름차순으로 정렬된 가장 긴 수열을 최장 증가 부분 수열이라 한다.
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 |