접근
수열 A 0번 요소부터 i - 1번 요소 중 A[i]보다 작은 수만 탐색하면서, 해당 요소가 가지고 있는 dp값 중 최대값을 찾는다. dp[i]에 해당 최대값보다 1 큰 값을 입력해주고 다음 수로 넘어가 계산을 계속한다.
예를 들어
i | 0 | 1 | 2 | 3 | 4 | 5 |
A | 10 | 20 | 10 | 30 | 20 | 50 |
dp | 1 |
i = 1 을 탐색할 때, A의 0 ~ i - 1 요소 중 A[1] = 20 보다 작은 요소는 [10]이고, 이 요소들 중 dp 값의 최대값은 10이 가진 1이므로 dp[1] 에는 1을 더하여 2를 입력해 준다.
i | 0 | 1 | 2 | 3 | 4 | 5 |
A | 10 | 20 | 10 | 30 | 20 | 50 |
dp | 1 | 2 |
i = 2 를 탐색할 때, A의 0 ~ i - 1 요소 중 A[2] = 10 보다 작은 요소는 없으므로 dp[2]에는 1을 입력해 준다.
i | 0 | 1 | 2 | 3 | 4 | 5 |
A | 10 | 20 | 10 | 30 | 20 | 50 |
dp | 1 | 2 | 1 |
i = 3 을 탐색할 때, A의 0 ~ i - 1 요소 중 A[3] = 30 보다 작은 요소는 [10, 20, 10]이고, 이 요소들 중 dp 값의 최대값은 20이 가진 2이므로 dp[3] 에는 1을 더하여 3를 입력해 준다.
dp는 수열의 특정 값이 증가하는 부분 수열의 최대값일 때의 부분 수열의 길이 값이다.
코드
import sys
n = int(sys.stdin.readline())
m = [0] + list(map(int, sys.stdin.readline().split()))
dp = [0 for _ in range(n + 1)]
for i in range(1, n + 1):
maximum = 0
for j in range(i):
if m[j] < m[i]:
if dp[j] >= maximum:
maximum = dp[j]
dp[i] = maximum + 1
print(max(dp))
더 생각해 볼 것?
더 쉽게 설명하는 방법을 찾아보자.
반응형
'코딩 > 백준 (Python)' 카테고리의 다른 글
백준 2565번: 전깃줄 (Python) (0) | 2021.03.29 |
---|---|
백준 11054번: 가장 긴 바이토닉 부분 수열 (Python) (0) | 2021.03.29 |
백준 2156번: 포도주 시식 (Python) (0) | 2021.03.28 |
백준 10844번: 쉬운 계단 수 (Python) (0) | 2021.03.28 |
백준 1463번: 1로 만들기 (Python) (0) | 2021.03.28 |
최근댓글