https://www.acmicpc.net/problem/11053
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
0. 알고리즘 분류
다이나믹 프로그래밍
1. 문제
2. 풀이
제목에서 보이다시피, 가장 긴 증가하는 부분 수열(LIS, Longest Increasing Subsequence) 문제이다. 개념을 몰라서 구글링으로 배웠다. 하나의 배열을 만들고, 여기에 입력값을 증가하는 순으로 쌓는다. 만약 작은 값이 들어오면 이분탐색으로 들어갈 수 있는 위치를 찾고, 그 위치에 값을 넣는다. 이를 반복해서 가장 긴 증가하는 부분 수열의 길이를 알 수 있다.
3. 코드
#include <iostream>
using namespace std;
int length[1001];
int binarySearch(int left, int right, int target) {
int mid;
while (left < right) {
mid = (left + right) / 2;
if (target > length[mid]) {
left = mid+1;
}
else {
right = mid;
}
}
return right;
}
int main(void) {
int n;
cin >> n;
int arr[n];
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int ix = 0;
length[ix] = arr[0];
for (int i = 1; i < n; i++) {
if (length[ix] < arr[i]) {
length[++ix] = arr[i];
}
else {
int temp = binarySearch(0, ix, arr[i]);
length[temp] = arr[i];
}
}
cout << ix+1;
return 0;
}
'IT > BOJ 문제정리' 카테고리의 다른 글
백준 1300번: K번째 수 (0) | 2021.08.02 |
---|---|
백준 2565번: 전깃줄 (0) | 2021.07.28 |
백준 1717번: 집합의 표현 (0) | 2021.07.23 |
백준 1676번: 팩토리얼 0의 개수 (0) | 2021.07.21 |
백준 17298번: 오큰수 (0) | 2021.07.20 |