문제
풀이
가장 큰 증가 부분 수열 문제의 응용 문제다.
이중 for문을 두 번 구성하여 dp[n][0]엔 왼쪽부터 증가하는 가장 긴 부분 수열의 길이를 기록하고, dp[n][1]엔 오른쪽부터 증가하는 가장 긴 부분 수열의 기록을 기록한다.
중복으로 겹쳐지는 부분이 있기 때문에 해를 구할 땐 1을 빼줘야 한다.
코드
import sys
n = int(sys.stdin.readline().strip())
a = [int(x) for x in sys.stdin.readline().split()]
dp = [[1 for _ in range(2)] for _ in range(n)]
for i in range(n):
for j in range(i):
if a[i] > a[j]:
dp[i][0] = max(dp[i][0], dp[j][0]+1)
for i in range(n-1, -1, -1):
for j in range(n-1, i, -1):
if a[i] > a[j]:
dp[i][1] = max(dp[i][1], dp[j][1]+1)
dp = list(map(lambda x: x[0]+x[1], dp))
print(max(dp)-1)
'CS > 알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 9095 - 1, 2, 3 더하기 [Python(파이썬)] (0) | 2021.02.01 |
---|---|
[백준] 2193 - 이친수 [Python(파이썬)] (0) | 2021.02.01 |
[백준] 11055 - 가장 큰 증가 부분 수열 [Python(파이썬)] (0) | 2021.01.29 |
[백준] 14503 - 로봇 청소기 [Python(파이썬)] (2) | 2021.01.26 |
[백준] 9020 - 골드바흐의 추측 [Python(파이썬)] (0) | 2021.01.26 |