득이공간

[백준 C++] 12015 가장 긴 증가하는 부분 수열 2 - 이분탐색 본문

PS/알고리즘 문제풀이

[백준 C++] 12015 가장 긴 증가하는 부분 수열 2 - 이분탐색

쟁득 2024. 2. 8. 11:43
 

12015번: 가장 긴 증가하는 부분 수열 2

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

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> LIS;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N;
	cin >> N;

	int Number;
	cin >> Number;
	LIS.emplace_back(Number);
	for (int i = 1; i < N; ++i)
	{
		cin >> Number;
		if (Number < LIS.back())
		{
			int Index = lower_bound(LIS.begin(), LIS.end(), Number) - LIS.begin();
			LIS[Index] = Number;
		}
		else if (Number > LIS.back())
		{
			LIS.emplace_back(Number);
		}
	}

	cout << LIS.size();
}

 

LIS(Longest Increasing Subsequence) - 최장 증가 수열의 개념에 대한 이해가 필요한 문제입니다.

lower_bound 함수(이분탐색)를 사용해서 LIS를 유지하기 위한 최적의 위치에 수를 삽입하는 방식으로 풀었습니다.

 

1. 수가 LIS의 마지막 원소보다 크다면 LIS에 푸시

2. 수가 LIS의 마지막 원소보다 작다면 LIS 내의 적절한 위치의 원소와 교체

3. 최종 LIS의 크기 출력


참고자료

 

[최장 증가 수열] LIS(Longest Increasing Subsequence)

이번 글에서는 DP중에서 특별한 케이스인 LIS에 대해 얘기해보자 합니다. LIS(Longest increasing Subsequence)는 가장 긴 증가하는 부분 수열 정도로 해석 가능합니다. 쉬운 이해를 위해서 예를 들어보겠습

jason9319.tistory.com

 

알고리즘 - c++ lower_bound, upper_bound 활용하기

컴퓨터/IT/알고리즘 정리 블로그

chanhuiseok.github.io