문제
문제이해
가장 긴 증가하는 부분 수열과 비슷하빈다. 이번에는 가장 긴 증가하는 부분 수열을 찾아야합니다.
우리는 dp 배열에 각 자리의 수열개수가 들어있다는 것을 압니다.
그러면 주어진 수열을 거꾸로 돌면서 최고 수열 개수인 수를 찾으면 됩니다.
그러니 최고 수열 개수를 1개 찾으면 1을 줄여줘서 다음 수를 찾아 봐야 합니다.
코드
test_case = int(input())
nums = list(map(int,input().split()))
dp = [1] * test_case
for i in range(1, test_case):
for j in range(i): # 자리수 맨 왼쪽부터 들어온다.
if(nums[i] > nums[j]): # 자리수 왼쪽부터 체크
dp[i] = max(dp[j]+ 1 , dp[i]) # 바뀐 것, 더 큰것 체크
#수열의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
print(max(dp)) # 꼭 끝쪽에 최대 길이 배열이 없을 수 있다.
#가장 긴 증가하는 부분 수열
high_num = max(dp)
li = []
for k in range(test_case-1, -1, -1):
if(dp[k] == high_num):
li.append(nums[k])
high_num -= 1 # 찾아야되는 수열을 1씩 줄인다.
li.reverse() # 거꾸로 출력한다.
for q in li:
print(q, end=' ')
728x90
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
[백준 알고리즘/Python] 1912 연속합 (0) | 2022.02.10 |
---|---|
[백준 알고리즘/Python] 1912 연속합 (0) | 2022.02.08 |
[백준 알고리즘/Python] 11053 가장 긴 증가하는 부분 수열 (0) | 2022.02.06 |
[백준 알고리즘/Python] 2193 이친수 (0) | 2022.02.05 |
[백준 알고리즘/Python] 10844 쉬운 계단 수 (0) | 2022.02.04 |