≪水平|Horizontal|Eas≫-最も長く成長した部分数列(11053)



Dynamic Programming


質問する
数列Aが与えられると、最も長い部分の数列を求めるプログラムが作成される.
例えば、A={10,20,10,30,20,50}を数える場合、最も長くなる部分はA={10,20,10,30,20,50}であり、長さは4である.
入力
第1行は、数列AのサイズN(1≦N≦1000)を与える.
2行目は、数列Aを構成するAiを与える.(1 ≤ Ai ≤ 1,000)
しゅつりょく
第1行出力数列Aの最長増分部分数列の長さ.
import sys

input = sys.stdin.readline
n = int(input())
A = [int(x) for x in input().split()]
DP = [1 for i in range(n)]

for i in range(n):
	for j in range(i + 1): # 0부터 자기 자신(i)까지 범위 탐색 
		if A[i] > A[j]: # 대소 비교
			DP[i] = max(DP[i], DP[j] + 1)
			# DP[i] => 기존 자기자신까지의 증가수열 최대 길이
			# DP[j] + 1 => i보다 작은 인덱스 j의 최대 길이값 + 1(i까지 증가수열의 길이로 포함)
			# 결국 i의 DP값과 (j의 DP값 + 1)을 비교해서 값 갱신

print(max(DP))
参照)
https://velog.io/@simonyun 97/白準-11053-問題-最長-増分-部分-数列LIS