https://www.acmicpc.net/problem/11054
import sys
N = int(sys.stdin.readline())
numbers = list(map(int, sys.stdin.readline().split()))
dp = [0 for _ in range(N)]
dp_inverse = [0 for _ in range(N)]
for i in range(N):
for v in range(i):
if numbers[i] > numbers[v]:
dp[i] = max(dp[i], dp[v])
dp[i]+=1
for i in range(N):
for v in range(i):
if numbers[N-1-i] > numbers[N-1-v]:
dp_inverse[N-1-i] = max(dp_inverse[N-1-i], dp_inverse[N-1-v])
dp_inverse[N-1-i]+=1
result = 0
for i in range(N):
result = max(result, dp[i] + dp_inverse[i])
print(result - 1)
부분수열 문제에서 다이나믹프로그래밍을 사용하는 것이 아직 익숙하지 않다.
고민했었던 풀이방법을 소개해보자면
이런 두개의 방법을 처음에는 많이 고민하고 구현해보았지만
넘버 리스트를 차례대로 돌면서 어떤 값이 나올때마다 규칙적으로 바뀌기 보다는 전체를 다 갈아 엎어야 하는 경우의 수도 존재했다.
그렇다면 하나하나 전부 다시 계산해보아야 하기 때문에 이렇게 구현하게 된다면 조건문도 많아질 뿐더러 시간복잡도도 증가하게된다.
따라서 위의 코드와 같이 구현하기로 방법을 변경했다.