본문 바로가기

취준/백준

[백준][Python][11054][DP]가장 긴 바이토닉 부분 수열

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

 

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

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

www.acmicpc.net

코드를 보면 알겠지만

을 각각 구하고, dp + dp2 -1(둘이 겹치는 부분, 꼭대기 부분) 이 가장 큰 값을 찾으면 된다.

 

import sys

n = int(sys.stdin.readline())

line = [int(i) for i in sys.stdin.readline().rstrip().split()]

dp = [0] * n
dp2 = [0]*n

if n ==1:
    print(1)
    sys.exit()

for i in range(n):
    dp[i] = 1
    for j in range(i):
        if line[i]>line[j] and dp[i] < dp[j]+1:
            dp[i] =  dp[j]+1
 

for i in range(n-1,-1,-1):
    dp2[i] = 1
    for j in range(n-1,i-1,-1):
        if line[i]>line[j] and dp2[i] < dp2[j]+1:
            dp2[i] =  dp2[j]+1

res = 0
for i in range(n):
    res = max(res, dp[i]+dp2[i]-1)

print(res)