수열 A에 대하여 그 수열의 부분 수열 중 가장 긴 바이토닉 부분 수열의 길이를 구하는 프로그램
10
1 5 2 1 4 3 4 5 2 1
틀린 해석
맞는 해석
가장 긴 부분 수열을 응용하여 앞뒤 2 방향으로 문제를 풀어나가면 된다.
기존 가장 긴 증가하는 부분 수열의 코드
dp = [1 for i in range(x)]
for i in range(x):
for j in range(i):
if arr[i] > arr[j]:
dp[i] = max(dp[i], dp[j]+1)
import sys
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
dp_increase = [1 for _ in range(N)]
dp_decrease = [1 for _ in range(N)]
for i in range(N):
for j in range(i):
if A[i] > A[j]:
dp_increase[i] = max(dp_increase[i], dp_increase[j] + 1)
for i in range(N-1, -1, -1):
for k in range(N-1, i, -1):
if A[i] > A[k]:
dp_decrease[i] = max(dp_decrease[i], dp_decrease[k] + 1)
dp_total = [x+y-1 for x, y in zip(dp_increase, dp_decrease)]
print(max(dp_total))