백준

11055 - 가장 큰 증가하는 부분 수열

whiporithm 2023. 6. 5. 17:07

 


 

문제

https://www.acmicpc.net/problem/11055

 

11055번: 가장 큰 증가하는 부분 수열

수열 A가 주어졌을 때, 그 수열의 증가하는 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가하는

www.acmicpc.net

 

풀이

가장 긴 증가하는 부분 수열과 비슷한 문제이다.

단 차이점은, 증가하는 부분 수열중 합이 가장 큰 값을 반환해야하는 것이다.

 

이 문제 또한 특정 인덱스에서 앞을 순회하면서,

1) 나보다 값이 작다면

2) 갱신되는 값이 더 크다면

갱신해준다. 라는 플로우를 따르면 된다. 

 

식으로 나타내면  D[i] = max(D[i], D[j] + arr[i]) 

(점화식 배열인 D[i] 는 i 까지 증가하는 수열의 가장 큰 합이 들어가있다. )

 

코드

l = int(input())
arr = list(map(int, input().split()))
s = [0] * 1001
for i in range(l):
    s[i] = arr[i]
for i in range(1,l):
    for j in range(i):
        if arr[j] < arr[i]:
            s[i] = max(s[i],s[j] + arr[i])

print(max(s))

 

후기

로직을 처음부터 생각하지 않고, 가장 긴 증가하는 수열 코드를 이리저리 만져서 풀려다가 오히려 헤맸다.

문제를 처음부터 천천히 접근하면서 생각하고 푸는 습관을 기르자.

'백준' 카테고리의 다른 글

18353 - 병사 배치하기  (0) 2023.06.09
14501 - 퇴사  (0) 2023.06.09
11053 - 가장 긴 증가하는 부분 수열  (0) 2023.06.04
11727 - 2 x n 타일링2  (0) 2023.06.04
11726 - 2 x n 타일링  (0) 2023.06.04