이 문제는 가장 긴 증가하는 or 감소하는 부분 수열 문제로 시리즈가 여러개 존재한다.
그만큼 우리가 확인해야하는 규칙성이 있다는 것인데,
알고리즘으로 LIS 알고리즘 (Longest Increase Sequence) 라고 한다.
11053 번 문제의 경우 N의 범위가 크지 않아 O(N^2) 으로 구현 가능하지만,
불가능한 경우 O(NlogN) 방식으로 구할 수 있다.
우선 이 문제는 완전탐색의 경우, 즉 O(N^2) 으로 풀이해두었다.
<소스코드>
#include <cstdio>
int N, A[1001], dp[1001], minn, maxx;
int main() {
scanf("%d", &N);
for (int i = 1; i <= N; i++) scanf("%d", A + i);
for (int i = 1; i <= N; i++) {
minn = 0;
for (int j = 0; j < i; j++) {
if (A[i] > A[j]) {
if (minn < dp[j]) minn = dp[j];
}
}
dp[i] = minn + 1;
if (maxx < dp[i]) maxx = dp[i];
}
printf("%d\n", maxx);
return 0;
}
'매일 알고리즘 2문제' 카테고리의 다른 글
| 8741 이진수 합 (0) | 2018.02.05 |
|---|---|
| 1421 나무꾼 이다솜 (0) | 2018.02.05 |
| 10026 적록색약 (0) | 2018.02.04 |
| 1016 제곱ㄴㄴ수 (0) | 2018.02.02 |
| 2789 유학 금지 (0) | 2018.02.02 |