バックアップ:最大数削減(11722)
Dynamic Programming
質問する
数列Aが与えられると、最長の減少部分数列を求めるプログラムが作成される.
例えば、A={10,30,10,20,20,10}を数えると、最も減衰が長い部分はA={10,30,10,20,20,10}となり、長さは3となる.
入力
第1行は、数列AのサイズN(1≦N≦1000)を与える.
2行目は、数列Aを構成するAiを与える.(1 ≤ Ai ≤ 1,000)
しゅつりょく
第1行出力数列Aの最長減少部分数列の長さ.
n = int(input())
a = list(map(int, input().split()))
dp = [1 for i in range(n)]
for i in range(1, n):
s = []
for j in range(i): # i 이전까지의 값들과 대소 비교
if a[j] < a[i]:
s.append(dp[j]) # 감소관계가 확인되면 j까지의 부분감소수열 값을 더한다.
if not s:
continue
else:
dp[i] += max(s) # 여러 부분감소수열 중에 가장 큰 값 누적
print(max(dp))
注)https://pacific-ocean.tistory.com/209Reference
この問題について(バックアップ:最大数削減(11722)), 我々は、より多くの情報をここで見つけました https://velog.io/@skkfea07/백준-가장-긴-감소하는-부분-수열11722テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol