https://www.acmicpc.net/problem/11054
11054번: 가장 긴 바이토닉 부분 수열
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
www.acmicpc.net
<풀이>
2022.03.06 - [# Coding/# 백준] - [백준 / 11053] 가장 긴 증가하는 부분 수열 - Python
[백준 / 11053] 가장 긴 증가하는 부분 수열 - Python
https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20,..
joinmycode.tistory.com
2022.03.06 - [# Coding/# 백준] - [백준 / 11722] 가장 긴 감소하는 부분 수열 - Python
[백준 / 11722] 가장 긴 감소하는 부분 수열 - Python
https://www.acmicpc.net/problem/11722 11722번: 가장 긴 감소하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20,..
joinmycode.tistory.com
위의 두 문제를 적절히 잘 조합하면 해당 문제의 답을 구할 수 있다.
바이토닉 수열은 증가하는 수열 + 감소하는 수열이다.
여기서 감소하는 수열을 구하는 것을 보면 dp[i]는 앞에서부터 i까지 구한 값이다. 하지만 위의 바이토닉 수열의 감소하는 수열은 뒤에서 부터 i까지 증가하는 수열을 구해야 한다. 즉, 바이토닉 수열은 증가하는 수열 + 역 증가하는 수열로 구해야 한다.
<전체 코드>
N = int(input())
arr = list(map(int, input().split()))
dp_orm = [1 for _ in range(N)]
dp_nrm = [1 for _ in range(N)]
for i in range(N):
for j in range(i):
if arr[i] > arr[j]:
dp_orm[i] = max(dp_orm[i], dp_orm[j]+1)
if arr[N-i-1] > arr[N-j-1]:
dp_nrm[N-i-1] = max(dp_nrm[N-i-1], dp_nrm[N-j-1]+1)
max_arr = 0
for i in range(N):
arrLen = dp_orm[i]+dp_nrm[i]-1
if max_arr < arrLen:
max_arr = arrLen
print(max_arr)
'# Coding > # 백준' 카테고리의 다른 글
[백준 / 16938] 캠프 준비 - Python (0) | 2022.03.11 |
---|---|
[백준 / 1393] 음하철도 구구팔 - Python (0) | 2022.03.11 |
[백준 / 11722] 가장 긴 감소하는 부분 수열 - Python (0) | 2022.03.06 |
[백준 / 11053] 가장 긴 증가하는 부분 수열 - Python (0) | 2022.03.06 |
[백준 / 7569] 토마토 - Python (0) | 2022.03.03 |