https://www.acmicpc.net/problem/11054
시간 1초, 메모리 256MB
input :
output :
조건 :
증가하는 부분증가 수열, 감소하는 부분증가 수열의 dp 값을 두개 구해서 그 둘을 더하면 길이를 구해낼 수 있지 않을 까?
dp_add = [1] * n
for i in range(n):
for j in range(i):
if data[i] > data[j]:
dp_add[i] = max(dp_add[i], dp_add[j] + 1)
dp_subtract = [1] * n
data.reverse()
for i in range(n):
for j in range(i):
if data[i] > data[j]:
dp_subtract[i] = max(dp_subtract[i], dp_subtract[j] + 1)
dp에 넣어두는 값을 보면 마지막에 자기자신도 포함이 된다. 그렇기 때문에 dp 리스트를 다시 reverse 해서 더해 줄 때는 1을 빼줘야 한다.
정답 코드 :
import sys
n = int(sys.stdin.readline())
data = list(map(int, sys.stdin.readline().split()))
dp_add = [1] * n
for i in range(n):
for j in range(i):
if data[i] > data[j]:
dp_add[i] = max(dp_add[i], dp_add[j] + 1)
dp_subtract = [1] * n
data.reverse()
for i in range(n):
for j in range(i):
if data[i] > data[j]:
dp_subtract[i] = max(dp_subtract[i], dp_subtract[j] + 1)
dp_subtract.reverse()
for idx, item in enumerate(dp_add):
dp_subtract[idx] += item
print(max(dp_subtract) - 1)