이 문제는 가장 긴 증가하는 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 |