11054번: 가장 긴 바이토닉 부분 수열
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
www.acmicpc.net
n = int(input())
a = list(map(int, input().split()))
d = [0] * n
d2 = [0] * n
# 가장 긴 증가하는 부분 수열 찾기
for i in range(n):
d[i] = 1 # 만약 증가하지 않는다면 1로 초기화
for j in range(i):
if a[i] > a[j] and d[i] < d[j] + 1:
d[i] = d[j] + 1
# 가장 긴 감소하는 부분 수열 찾기
for i in range(n - 1, -1, -1):
d2[i] = 1
for j in range(i + 1, n):
if a[i] > a[j] and d2[i] < d2[j] + 1:
d2[i] = d2[j] + 1
result = [d[i] + d2[i] - 1 for i in range(n)]
print(max(result))
바이토닉 수열
증가하다가 어떤 기점을 중심으로 다시 감소하는 수열.
즉 i번째에서 끝나는 가장 긴 증가하는 부분수열 + i번째에서 시작하는 가장 긴 감소하는 부분수열이다.
'백준 알고리즘 (Baekjoon Algorithm)' 카테고리의 다른 글
[파이썬] 백준 알고리즘 No.16198 에너지 모으기 (0) | 2022.01.23 |
---|---|
[파이썬] 백준 알고리즘 No.16197 두 동전 (0) | 2022.01.23 |
[파이썬] 백준 알고리즘 No.1309 동물원 (0) | 2022.01.15 |
[파이썬] 백준 알고리즘 No.1149 RGB 거리 (0) | 2022.01.14 |
[파이썬] 백준 알고리즘 No.2225 합분해 (0) | 2022.01.13 |