2352번: 반도체 설계
첫째 줄에 정수 n(1 ≤ n ≤ 40,000)이 주어진다. 다음 줄에는 차례로 1번 포트와 연결되어야 하는 포트 번호, 2번 포트와 연결되어야 하는 포트 번호, …, n번 포트와 연결되어야 하는 포트 번호가 주
www.acmicpc.net
이 문제를 풀면서 LIS를 O(N^2)이 아닌 O(NlogN) 시간에 푸는 방법에 대해서 배우게 되었다.
핵심은 lower_bound를 사용하여 logN 시간에 LIS배열을 완성한다는 것이다.
#include <iostream>
#include <algorithm>
using namespace std;
int port[40000];
int Greedy(int n)
{
int LIS[40000], size = 1;
LIS[0] = port[0];
for (int i = 1; i < n; i++)
{
if (LIS[size-1] < port[i])
{
LIS[size] = port[i];
size++;
}
else
{
int idx = lower_bound(LIS, LIS + size, port[i]) - LIS;
LIS[idx] = port[i];
}
}
return size;
}
int main(void)
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> port[i];
cout << Greedy(n) << endl;
return 0;
}
알고리즘 200일 프로젝트 - 114 day
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1783번: 병든 나이트 (0) | 2020.08.03 |
---|---|
백준 1138번: 한 줄로 서기 (0) | 2020.08.02 |
백준 1080번: 행렬 (0) | 2020.07.29 |
백준 16637번: 괄호 추가하기 (0) | 2020.07.29 |
백준 2529번: 부등호 (0) | 2020.07.29 |