문제 풀이/백준(BOJ)
[C++] 백준 12738번 : 가장 긴 증가하는 부분 수열3
희조당
2021. 6. 22. 17:35
728x90
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
문제 풀이
이전 문제와 다른 점은 입력 값이 음수 범위도 포함한다는 점이다.
하지만 코드 자체는 차이가 없다.
코드
#include <iostream>
using namespace std;
int n;
int arr[1000001], dp[1000001];
int binary(int left, int right, int key) {
int mid;
while (left <= right) {
mid = (left + right) / 2;
if (dp[mid] >= key) right = mid - 1;
else left = mid + 1;
}
return left;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
dp[0] = arr[0];
int idx = 0;
for (int i = 1; i < n;i++) {
if (dp[idx] < arr[i]) dp[++idx] = arr[i];
else {
int lower_bound = binary(0, idx, arr[i]);
dp[lower_bound] = arr[i];
}
}
cout << idx + 1;
}