[Gold IV] Title: 가장 긴 바이토닉 부분 수열, Time: 104 ms, Memory: 32412 KB -BaekjoonHub
This commit is contained in:
32
백준/Gold/11054. 가장 긴 바이토닉 부분 수열/README.md
Normal file
32
백준/Gold/11054. 가장 긴 바이토닉 부분 수열/README.md
Normal 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>
|
||||
|
||||
34
백준/Gold/11054. 가장 긴 바이토닉 부분 수열/가장 긴 바이토닉 부분 수열.py
Normal file
34
백준/Gold/11054. 가장 긴 바이토닉 부분 수열/가장 긴 바이토닉 부분 수열.py
Normal 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))
|
||||
Reference in New Issue
Block a user