https://www.acmicpc.net/problem/11054
11054번: 가장 긴 바이토닉 부분 수열
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
www.acmicpc.net
well-known problem인 LIS를 조금 응용하면 풀 수 있는 문제!
n = int(input())
nums = list(map(int, input().split()))
dp_asc = [0 for _ in range(n)]
dp_desc = [0 for _ in range(n)]
for i in range(n):
max_val = 0
for j in range(i):
if nums[j] < nums[i]:
max_val = max(max_val, dp_asc[j])
dp_asc[i] = max_val+1
nums.reverse()
for i in range(n):
max_val = 0
for j in range(i):
if nums[j] < nums[i]:
max_val = max(max_val, dp_desc[j])
dp_desc[i] = max_val+1
answer = -1
for i in range(n):
answer = max(answer, dp_asc[i] + dp_desc[n-1-i])
print(answer-1)
댓글