n = int(input())
li = list(map(int,input().split()))
#증가하는 수열 - LIS
dp = li[:]
for i in range(n):
for j in range(i):
if li[i] > li[j]:
dp[i] = max(dp[i],dp[j]+li[i])
print(max(dp))
11054번에서 만든 증가하는 부분수열 구하는 알고리즘에서 부분수열의 개수를 구하는 것이 아니라 부분수열의 합을 구해서 dp리스트에 업데이트를 해주면 된다.
아래 코드는 증가하는 부분수열의 개수를 구하는 알고리즘이다. 비교를 해보면 위의 dp[j]+li[i]는 부분수열의 합을 구하기 위한 계산이고 dp[j]+1은 부분수열의 개수를 구하기 위한 계산이다.
n = int(input())
li = list(map(int,input().split()))
#증가하는 수열 - LIS
dp= [1 for i in range(n)]
for i in range(n):
for j in range(i):
if li[i] > li[j]:
dp[i] = max(dp[i],dp[j]+1)
728x90
'알고리즘 문제풀이 > Dynamic programming' 카테고리의 다른 글
(파이썬 python) 백준 11051번 : 이항 계수 2 (0) | 2022.11.06 |
---|---|
(파이썬 python) 백준 11054번 : 가장 긴 바이토닉 부분 수열 (0) | 2022.11.03 |
(파이썬 python) 백준 11057번 : 오르막 수 (0) | 2022.10.28 |
(파이썬 python) 백준 2293번 : 동전 1 (0) | 2022.10.28 |
(파이썬 python) 백준 9465번 : 스티커 (0) | 2022.10.26 |