# 문제
# 코드
import sys
n = int(sys.stdin.readline().strip())
arr = list(map(int,sys.stdin.readline().split()))
# print(arr)
# 왼쪽부터 증가하는 수열을 구한다.
dpL = [1] * n
for pivot in range(n) :
for i in range(pivot) :
if arr[i] < arr[pivot] :
dpL[pivot] = max(dpL[pivot], dpL[i] + 1)
# print(dpL)
# 오른쪽부터 증가하는 수열을 구한다.
dpR = [1] * n
for pivot in range(n-1,-1,-1) :
for i in range(n-1,pivot,-1) :
if arr[i] < arr[pivot] :
dpR[pivot] = max(dpR[pivot], dpR[i]+1)
# print(dpR)
# dpL과 dpR의 합을 구한뒤 -1을 하자
# 1의 값은 중복되기 때문에 빼줘야 한다
for i in range(len(dpL)) :
dpR[i] = dpL[i] + dpR[i]
print(max(dpR)-1)
# 풀이
- 가장 긴 부분수열을 구하는 문제를 그대로 응용 한다면 쉽게 풀 수 있다.
- 특정 수 S(k)에서 왼쪽과 오른쪽 모두 가장 작은 수들로 수열을 만들어야 한다.
- 두 방향으로 하여금 S(k)보다 작은것들의 개수를 DP를 활용하여 세어준다.
- 왼쪽 한번 ==> dpL , 오른쪽 한번 ==> dpR을 수행하고 dpL과 dpR을 더해준 후 1을 뺴줘야 한다.
- 1은 겹치기 때문이다.
'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글
[백준17070&파이썬] State를 통해서 파이프의 이동방향을 다각화 하기 (0) | 2023.06.06 |
---|---|
[백준12865&파이썬] 0-1 냅색문제(배낭문제) (0) | 2023.06.05 |
[백준11053&파이썬] DP를 이용하여 반복문을 하나 줄일 수 있다. (0) | 2023.06.01 |
[백준2096&파이썬] DP와 슬라이딩 윈도우를 이용하기 (0) | 2023.05.30 |
[백준5639&파이썬] BST의 preorder를 postorder로 변환하는 방법 (0) | 2023.05.29 |