11054. 가장 긴 바이토닉 부분 수열
11054번: 가장 긴 바이토닉 부분 수열
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
www.acmicpc.net
- 풀이
- 최장증가부분수열을 구하는 LIS 함수를 만들어두고
- 최장감소부분수열은 값에 -를 붙여서 LIS함수에 넘기면 같은 길이값을 반환함
- i까지의 최장증가부분수열의 길이, i이후의 최장감소증가부분수열의 길이를 구해서 -1 (하나 값 중복되므로)
import bisect
def lis(arr):
if not arr:return 0
dp = [arr[0]]
for i in range(len(arr)):
if dp[-1]<arr[i]:
dp.append(arr[i])
else:
dp[bisect.bisect_left(dp,arr[i])] = arr[i]
return len(dp)
n = int(input())
num = list(map(int,input().split()))
answer = -1
for i in range(n):
answer = max(answer,lis(num[:i+1])+lis([-x for x in num[i:]])-1)
print(answer)
'코딩테스트 > BOJ' 카테고리의 다른 글
| [백준][벨만포드] 1865. 웜홀 (4) | 2024.03.07 |
|---|---|
| [백준][그리디] 1783. 병든 나이트 (0) | 2024.03.07 |
| [백준][이진탐색][LIS] 12015. 가장 긴 증가하는 부분 수열 2 (0) | 2024.03.01 |
| [백준][DP][LIS] 11055. 가장 큰 증가하는 부분 수열 (1) | 2024.03.01 |
| [백준][DP][LCS] 9251. LCS(최장공통부분수열) (0) | 2024.02.28 |