코드
#include <stdio.h>
#include <algorithm>
using namespace std;
int n, a[1003],cnt[1003],res;
int main() {
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
for(int i = 0; i < n; i++) {
auto k = lower_bound(cnt, cnt + res, a[i]);
if(*k == 0) res++;
*k = a[i];
}
printf("%d", res);
return 0;
}
문제에 따르면, 크기가 작은 상자를 최대한 많이 넣어야 한다. 이는 최대부분증가수열 (LIS)로 해석할 수 있다. 위 풀이는 LIS를 O(NlogN)으로 구하는 코드이다.
'백준' 카테고리의 다른 글
[백준] 2098번 외판원 순회 C++ 코드 (0) | 2024.08.08 |
---|---|
[백준] 15624번 피보나치 수 7 C++ 코드 (0) | 2024.08.06 |
[백준] 1890번 점프 C++ 코드 (0) | 2024.08.06 |
[백준] 2042번 구간 합 구하기 C++ 코드 (0) | 2024.08.06 |
[백준] 2568번 전깃줄 - 2 C++ 코드 (0) | 2024.08.06 |