본문 바로가기

알고리즘

BOJ 1365 꼬인 전깃줄

1365번: 꼬인 전깃줄 (acmicpc.net)

 

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