[동적계획법] 가장 긴 바이토닉 부분 수열

2021. 12. 12. 11:57백준

가장 긴 증가하는 부분 수열의 응용버전이다.

이전 문제를 풀었다면 어렵지는 않은 문제일 것 같다.

 

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

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

www.acmicpc.net

from sys import stdin

N, A = int(stdin.readline()), list(map(int, stdin.readline().split(" ")))
T_L, T_R = [1] * N, [1] * N


def get_table_left(ind: int):
    m = 0
    for i in range(ind, -1, -1):
        if A[ind] > A[i] and m < T_L[i]:
            m = T_L[i]

    T_L[ind] = m + 1


def get_table_right(ind: int):
    m = 0
    for i in range(N - ind):
        if A[ind] > A[ind + i] and m < T_R[ind + i]:
            m = T_R[ind + i]

    T_R[ind] = m + 1


for i in range(N):
    get_table_left(i)
    get_table_right(N - i - 1)

print(max(T_R[i] + T_L[i] for i in range(N)) - 1)