Search

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

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

Tip

특정 인덱스 i를 기준으로 가장 긴 바이토닉 부분 수열 길이 구하기
i 기준으로 가장 긴 증가하는 부분 수열 길이 + 가장 긴 감소하는 부분 수열 길이 - 1
가장 긴 증가 / 감소하는 부분 수열 길이는 다이나믹 프로그래밍을 활용해서 구하자!

풀이 소스 코드

import sys si = sys.stdin.readline # n과 수열 입력 n = int(si()) array = list(map(int, si().split())) # 증가, 감소, 바이토닉 부분 수열 길이를 담을 DP 테이블 up = [1] * n # 증가 down = [1] * n # 감소 dp = [1] * n # 바이토닉 # 증가하는 부분 수열 길이 계산 for i in range(n): for j in range(i): if array[i] > array[j]: up[i] = max(up[i], up[j] + 1) # 감소하는 부분 수열 길이 계산 for i in range(n - 1, -1, -1): for j in range(n - 1, i, -1): if array[i] > array[j]: down[i] = max(down[i], down[j] + 1) # 증가하는 부분 수열 길이와 감소하는 부분 수열 길이를 더해 바이토닉 수열 길이 계산 for i in range(n): dp[i] = up[i] + down[i] - 1 # 출력 print(max(dp))
Python