접근
백준 단계별 문제에서 바로 이전 단계인 11053번 가장 긴 증가하는 부분 수열과 비슷한 문제이다.
2021.03.28 - [SW/백준 (Python)] - 백준 11053번: 가장 긴 증가하는 부분 수열 (Python)
백준 11053번: 가장 긴 증가하는 부분 수열 (Python)
접근 수열 A 0번 요소부터 i - 1번 요소 중 A[i]보다 작은 수만 탐색하면서, 해당 요소가 가지고 있는 dp값 중 최대값을 찾는다. dp[i]에 해당 최대값보다 1 큰 값을 입력해주고 다음 수로 넘어가 계산
ca.ramel.be
다만 다른 점은 증가하는 수열이 아닌 바이토닉 수열(의미는 문제 참조)이기 때문에 증가하다가 감소하는 수열이어야 한다. 이를 해결 하기 위해 앞에서 부터 증가하는 부분 수열을 구할 뿐 아니라 뒤에서 부터 순서로 계산하여 감소하는 수열도 구하여야 한다. 이를 합산하면 답을 구할 수 있다.
코드
import sys
n = int(sys.stdin.readline())
m = [0] + list(map(int, sys.stdin.readline().split())) + [0]
dp1 = [0 for _ in range(n + 2)]
dp2 = dp1[:]
dp = dp1[:]
for i in range(1, n + 1):
maximum1 = 0
maximum2 = 0
for j in range(i):
if m[j] < m[i]:
if dp1[j] >= maximum1:
maximum1 = dp1[j]
if m[n - j + 1] < m[n - i + 1]:
if dp2[n - j + 1] >= maximum2:
maximum2 = dp2[n - j + 1]
dp1[i] = maximum1 + 1
dp2[n - i + 1] = maximum2 + 1
for i in range(len(dp1)):
dp[i] = dp1[i] + dp2[i] - 1
print(max(dp))
더 생각해 볼 것?
...
반응형
'코딩 > 백준 (Python)' 카테고리의 다른 글
백준 9251번: LCS (Python) (0) | 2021.03.30 |
---|---|
백준 2565번: 전깃줄 (Python) (0) | 2021.03.29 |
백준 11053번: 가장 긴 증가하는 부분 수열 (Python) (0) | 2021.03.28 |
백준 2156번: 포도주 시식 (Python) (0) | 2021.03.28 |
백준 10844번: 쉬운 계단 수 (Python) (0) | 2021.03.28 |
최근댓글