PS/Baekjoon Online Judge

[백준 11054] 가장 긴 바이토닉 부분 수열 [Python]

kimyoungrok 2023. 4. 29. 04:44

백준 11054 - 문제
백준 11054 - 입/출력


풀이

LIS문제의 원리를 잘 다룬 문제이다.

기존에 O(N^2) 방식으로 LIS를 구할 때, 비연속 LIS 길이를 찾을 수 있었다.

 

[백준 11053] 가장 긴 증가하는 부분 수열 [Python]

풀이 LIS (Longest Increasing Subsequence)는 최장 증가 부분 수열로, N개의 원소에 대해 요소를 골라 만든 부분 수열을 만들 때 각 원소가 이전 요소보다 큰 원소로 이루어진 부분 수열을 의미한다. 즉, 가

kyr-db.tistory.com

 

LDS를 찾을 때도 마찬가지로 같은 방식을 사용했다.

 

[백준 11722] 가장 긴 감소하는 부분 수열 [Python]

풀이 일전에 풀었던 LIS문제에서 사용한 방법을 응용해 풀이할 수 있다. [백준 11053] 가장 긴 증가하는 부분 수열 [Python] 풀이 LIS (Longest Increasing Subsequence)는 최장 증가 부분 수열로, N개의 원소에

kyr-db.tistory.com

그렇다면 이번 문제에서 주어지는 LBS(Longest Bitonic Subsequence)는 어떻게 구해야 할까?


구간별 LIS, LDS, LBS 길이를 아래 그림을 통해 살펴보자.

결국 구간별로 비연속적 증가 또는 감소하는 길이를 탐색하는 과정이다.  

1 ~ N 번 요소에 대한 LIS 길이와, N ~ 1 번 요소에 대한 LDS 길이의 합은 결국 LBS 길이의 합과 같다.

 

즉 예외 상황에 대해 아래와 같은 결론을 얻을 수 있다.

S(1) > S(2) > ... S(k-1) > S(k) < S(k+1) ... < S(N-1) < S(N) 일 때, LBS는 S(1) ~ S(k) 또는 S(k) ~ S(N) 이다. 

LIS와 LDS의 길이값이 서로 교차하며 증가할 때, 구하고자 하는 값이 구간별 비연속적인 길이값이므로 LBS는 여전히 성립한다.

이제 LIS, LDS 길이를 동시에 구해주자! 

다 구했다면, LBS[i] = LIS[i] + LDS[i] - 1 으로 구할 수 있으며, 이 중 최댓값을 출력해주면 된다.


소스코드

소스코드 보기


출처

 

11054번: 가장 긴 바이토닉 부분 수열

첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)

www.acmicpc.net