알고리즘 문제 해결/BOJ

[LIS, 이분 탐색] BOJ 12738 가장 긴 증가하는 부분 수열 3 (C++)

jmkimmessi 2022. 6. 13. 15:16
반응형

https://www.acmicpc.net/problem/12738

 

12738번: 가장 긴 증가하는 부분 수열 3

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)

www.acmicpc.net

 

문제 해결 알고리즘

 

이분 탐색을 이용한 LIS알고리즘을 이용한다.

 

https://kimmessi.tistory.com/191?category=871925 

 

[알고리즘] 최장 증가 부분 수열(LIS) - DP, 이분 탐색, LIS 출력

최장 증가 부분 수열 (LIS)이란? 어떤 수열에서 수열의 일부 원소를 골라 만든 부분 수열 중, 각 원소가 이전 원소보다 크다는 조건을 만족하고, 그 길이가 최대인 수열을 최장 증가 부분 수열이라

kimmessi.tistory.com

자세한 내용은 위의 링크를 참고

 

소스 코드

 

#include <bits/stdc++.h>
#define MAX 1000001
using namespace std;
 
int arr[MAX];
int LIS[MAX];
 
int binary_search(int left, int right, int target){
 
    int mid;
 
    while(left < right){
 
        mid = (left + right) / 2;
 
        if(LIS[mid] < target) left = mid + 1;
        else right = mid;
 
    }
 
    return right;
}
 
int main(){
 
    ios::sync_with_stdio(0);
	cin.tie(0);
 
    int N; cin >> N;
 
    for(int i=0;i<N;i++){
        cin >> arr[i];
    }
 
    int j = 0, i = 1;
    LIS[0] = arr[0];
 
    while(i < N){
 
        if(LIS[j] < arr[i]){
            LIS[j+1] = arr[i];
            j++;
        }
        else {
            int idx = binary_search(0, j, arr[i]);
            LIS[idx] = arr[i];
        }
 
        i++;
    }
 
    cout << j+1;
 
 
}
반응형