🗝️ Algorithm/🟩 백준

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

Dbswnstjd 2023. 5. 9. 10:38

문제

https://www.acmicpc.net/problem/11054

 

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

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

www.acmicpc.net

풀이

# 백준 11054번 문제 - 가장 긴 바이토닉 부분 수열
n = int(input())
arr = list(map(int, input().split()))

dp_increase = [1] * (n)
dp_decrease = [1] * (n)
for i in range(1, n):
    for j in range(i):
        if arr[i] > arr[j] and dp_increase[i] <= dp_increase[j]:
            dp_increase[i] = dp_increase[j] + 1
for i in range(n-1, -1, -1):
    for j in range(i, n):
        if arr[i] > arr[j] and dp_decrease[i] <= dp_decrease[j]:
            dp_decrease[i] = dp_decrease[j] + 1

for i in range(n):
    dp_increase[i] = dp_increase[i] + dp_decrease[i] - 1
print(max(dp_increase))

LIS 와 비슷한 문제이지만 경우를 증가하는 부분 수열과 감소하는 부분수열 두가지로 나누어서 계산해야 한다.