🗝️ 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 와 비슷한 문제이지만 경우를 증가하는 부분 수열과 감소하는 부분수열 두가지로 나누어서 계산해야 한다.