최대 1 분 소요

swea 3307 최장 증가 부분 수열

사용언어 : PYTHON

풀이

백준에서 한 번 풀이를 했던 문제였다

dp를 사용해서 풀어야 하는데 점화식을 어떻게 세워야 할 지 잘 생각이 나지 않았다.

왜 점화식을 세우지 못했는지 풀이를 보고 알았다.

이 문제는 0~n까지 차례대로 dp리스트를 채운뒤 dp[n-1]이 정답이 되는것이 아닌 max(dp)가 정답이기 때문이었다.

dp[i] 는 l[i] (입력으로 받는 수열) 를 사용했을 때 생성될 수 있는 최장 증가 부분 수열의 길이이다

0 <= i < N 일 때 dp[i](0 <= j < i) 일때 l[j] < l[i]dp[j] 값 중 가장 큰 값 + 1 이다.

그러한 값이 없다면 1을 넣는다. (자기 자신)

그림으로 나타내면 다음과 같다

image

평소에 풀었던 dp의 방식과 접근 방법이 달라서 많이 헷갈린다.

잊지 않게 잘 기억해야겠다.

코드

def find_prev(n): # 인덱스가 i < n 인 dp리스트에서 l[i] < l[n]인 dp[i]값 중 가장 큰 값을 반환
    answer=[0]

    for j in range(n):
        if l[j]<l[n]:
            answer.append(dp[j])

    return max(answer)


def solve():
    for p in range(N):
        dp[p]=find_prev(p)+1


T=int(input())

for i in range(T):
    N=int(input())
    l=list(map(int,input().split()))
    dp=[0]*N
    solve()
    print(dp)
    print('#{} {}'.format((i+1),max(dp)))

댓글남기기