주어진 두 수열의 최장 증가 부분 수열(Longest Increasing Subsequence)의 길이를 계산하는 문제.
T = int(input()) # 테스트케이스의 개수 T
for test_case in range(1, T+1):
N = int(input()) # 수열의 길이
A = list(map(int, input().split())) # 수열
L = [0 for i in range(N)] # 최대 증가 수열의 길이
for i in range(N):
max_ = 1
for j in range(i):
if(A[j] <= A[i]): # 수열 A[j]가 작을 시
max_ = max(L[j]+1, max_) # 최강 증가 수열의 길이 +1와 max값 비교
L[i] = max_ # 최강 증가 수열 저장
print("#%d %d" %(test_case, max(L)))
[문제풀이]
DP를 통해 푸는 문제.

L[i] = (L[i] >= L[j])중 가장 큰 L[j]+1
각 위치에서의 최장 증가 수열은 이렇게 구한다.

현 증가 수열, L[i]를 구하기 위해선 우선 수열 A를 봐야 한다.
A[i]보다 작은 A[j]를 가진다면 그 위치 증가 수열에 현 수열의 값을 더한게 증가 수열이 된단 의미다.
위의 경우엔 이전 수열의 값 모두가 현 수열의 값보다 작다.
[4, 5]
[2, 3, 5]
[3, 5]
[1, 5]
그럼 각 위치에서의 증가 수열+A[i]하면 이렇게 된다.
이 경우 중 가장 큰 길이를 갖는게 현재 위치에서의 최장 증가 수열의 길이!
max(L)
이렇게 각 위치에서의 최장 증가 수열을 가진 배열 L을 구한 후, 그 중 최대값을 구하면 전체 배열에서의 최장 증가 수열의 길이가 된다.
'코딩테스트 > SWEA' 카테고리의 다른 글
| [Python, 파이썬] SWEA 1238. [S/W 문제해결 기본] 10일차 - Contact (0) | 2024.11.11 |
|---|---|
| [Python, 파이썬] SWEA 3499. 퍼펙트 셔플 (1) | 2024.11.11 |
| [Python, 파이썬] SWEA 1231. [S/W 문제해결 기본] 9일차 - 중위순회 (2) | 2024.11.10 |
| [Python, 파이썬] SWEA 1219. [S/W 문제해결 기본] 4일차 - 길찾기 (0) | 2024.11.10 |
| [Python, 파이썬] SWEA 3809. 화섭이의 정수 나열 (0) | 2024.11.10 |