백준 11054 가장 긴 바이토닉 부분 수열 (파이썬)


11054 가장 긴 바이토닉 부분 수열 문제 바로가기

접근방식

  • 11053 가장 긴 증가하는 부분 수열이 순방향으로 체크를 한다면 이 문제는 역방향으로도 체크를 해주는 방식이다.
  • 11053 가장 긴 증가하는 부분 수열 문제 해설은 아래 링크에서 확인해볼 수 있다.

https://ataraxiady.github.io/dev/2021/03/30/dev-boj-1_11053/


파이썬 코드

import sys

n = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))

dp1 = [0 for i in range(n)]
dp2 = [0 for i in range(n)]
total = [0 for i in range(n)]

# 순방향
for i in range(n):
    for j in range(i):
        # index 0부터 i-1까지 arr와 dp값을 비교한다
        # arr[i]가 arr[j]보다 큰데 dp[i]는 작을 경우 dp[i] 값을 dp[j]로 바꿔준다.
        # (값은 큰데 카운트 값은 작은 경우)
        if arr[i] > arr[j] and dp1[i] < dp1[j]:
            dp1[i] = dp1[j]
    # 조건없이 +1을 한다.
    dp1[i] = dp1[i] + 1

# 역방향
for i in range(n-1,-1,-1):
    for j in range(n-1,i,-1):
        if arr[i] > arr[j] and dp2[i] < dp2[j]:
            dp2[i] = dp2[j]
    dp2[i] = dp2[i] + 1

for i in range(n):
    total[i] = dp1[i] + dp2[i] - 1

print(max(total))





© 2020.09. by 다로

Powered by theorydb