CP 예상문제 03

HyeJi9908·2022년 4월 4일
0
#11054 가장 긴 바이토닉 부분 수열 : 수열 내에 오름차순 정렬, 내립차순 정렬이 있다
# 유형 1:{10, 20, 30, 25, 20} : 어떤 수(30)를 기준으로 오름차순, 내림차순 둘 다 존재
# 유형 2:{10, 20, 30, 40} :어떤 수(40)을 기준으로 오름차순 정렬
# 유형 3:{50, 40, 30, 10} : 어떤 수 (50)을 기준으로 내림차순 정렬
# 가장 긴 증가하는 부분 수열 + 가장 긴 감소하는 부분 수열 문제!

n= int(input())
p=list(map(int,input().split()))
increase_dp=[1 for _ in range(n)]
decrease_dp=[1 for _ in range(n)]

for i in range(n):
    for j in range(i):
        if p[i] > p[j] :
            increase_dp[i]=max(increase_dp[i],increase_dp[j]+1)

for i in range(n-1,-1,-1):  # 가장 긴 감소하는 부분 수열은 입력받은 수열을 역방향으로 돌려서 구하기
    for j in range(n-1,i,-1):
        if p[i] > p[j]:
            decrease_dp[i] = max(decrease_dp[i],decrease_dp[j]+1)

res=[0]*n
for i in range(n):
    res[i] = increase_dp[i]+decrease_dp[i]-1 # -1: 1 2 4 5 3 2 이면  1 2 3 4 5 / 5 3 2이때 중복되는 5 하나 빼기

print(max(res))

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

0개의 댓글