[Gold IV] Title: 가장 긴 바이토닉 부분 수열, Time: 104 ms, Memory: 32412 KB -BaekjoonHub

This commit is contained in:
SSUM
2025-03-30 12:57:47 +09:00
parent 10f0cfc812
commit 23dbc5fb46
2 changed files with 66 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
# [Gold IV] 가장 긴 바이토닉 부분 수열 - 11054
[문제 링크](https://www.acmicpc.net/problem/11054)
### 성능 요약
메모리: 32412 KB, 시간: 104 ms
### 분류
다이나믹 프로그래밍
### 제출 일자
2025년 3월 30일 12:57:28
### 문제 설명
<p>수열 S가 어떤 수 S<sub>k</sub>를 기준으로 S<sub>1</sub> < S<sub>2</sub> < ... S<sub>k-1</sub> < S<sub>k</sub> > S<sub>k+1</sub> > ... S<sub>N-1</sub> > S<sub>N</sub>을 만족한다면, 그 수열을 바이토닉 수열이라고 한다.</p>
<p>예를 들어, {10, 20, <strong>30</strong>, 25, 20}과 {10, 20, 30, <strong>40</strong>}, {<strong>50</strong>, 40, 25, 10} 은 바이토닉 수열이지만, {1, 2, 3, 2, 1, 2, 3, 2, 1}과 {10, 20, 30, 40, 20, 30} 은 바이토닉 수열이 아니다.</p>
<p>수열 A가 주어졌을 때, 그 수열의 부분 수열 중 바이토닉 수열이면서 가장 긴 수열의 길이를 구하는 프로그램을 작성하시오.</p>
### 입력
<p>첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 A<sub>i</sub>가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ A<sub>i</sub> ≤ 1,000)</p>
### 출력
<p>첫째 줄에 수열 A의 부분 수열 중에서 가장 긴 바이토닉 수열의 길이를 출력한다.</p>

View File

@@ -0,0 +1,34 @@
import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int, input().split()))
def lis_length_dp(nums):
dp = [1] * n
for i in range(n):
for j in range(i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j]+1)
return dp
def reverse_lis_length_dp(nums):
dp = [1] * n
for i in range(n-1,-1 , -1):
for j in range(n-1, i-1, -1):
if nums[i] > nums[j] :
dp[i] = max(dp[i], dp[j]+1)
return dp
left_arr = lis_length_dp(arr)
right_arr = reverse_lis_length_dp(arr)
sum_dp = [0 for _ in range(n)]
for i in range(n):
sum_dp[i] = left_arr[i] + right_arr[i] - 1
print(max(sum_dp))