11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
# dp[i] = i번째 수를 마지막 원소로 가지는 부분수열의 최대길이
# (j번째 수 = i번째 수와 연결되는 앞 수열의 작은 수)
#
# dp[i] = max(dp[j]) + 1, j < i
#
# nums = [10, 20, 10, 30, 20, 50]
#
# dp[0] = {10} = 1
# dp[1] = {10,20} = 2
# dp[2] = {10} = 1
# dp[3] = {10,30} or {..,20,30} or {..,10,30} = max(dp[0],dp[1],dp[2]) + 1 = 3
# dp[4] = max(dp[0],dp[2]) + 1 = 2
# dp[5] = max(dp[0],dp[1],dp[2],dp[3],dp[4]) + 1 = 4
def run(N, a):
dp = [1] * N
for i in range(1, N):
for j in range(0, i):
if a[j] < a[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
N = int(input())
nums = list(map(int, input().split()))
length = run(N, nums)
print(length)
'BOJ 알고리즘 (패캠) > DP' 카테고리의 다른 글
2655번: 가장높은탑쌓기 LIS (DP) - Fastcampus (0) | 2020.10.11 |
---|---|
1495번: 기타리스트 (DP) - Fastcampus (0) | 2020.10.10 |
9251번: LCS 가장 긴 공통 부분수열 (DP) - Fastcampus (0) | 2020.10.10 |
12865번: 평범한 배낭 (DP) - Fastcampus (0) | 2020.10.09 |
1904번: 01타일 (DP) - Fastcampus (0) | 2020.10.09 |