본문 바로가기
BOJ

[Python] 백준 11055: 가장 큰 증가하는 부분 수열

by 야호호코코 2024. 7. 15.
반응형

 solved.ac기준 Silver 2 - DP

 

문제

수열 A가 주어졌을 때, 그 수열의 증가하는 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가하는 부분 수열은 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 이고, 합은 113이다.

입력

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)

출력

첫째 줄에 수열 A의 합이 가장 큰 증가하는 부분 수열의 합을 출력한다.

예제 입력 1

10
1 100 2 50 60 3 5 6 7 8

예제 출력 1

113

 

정답 코드

n = int(input())
arr = list(map(int, input().split()))
dp = [arr[i] for i in range(n)]

for i in range(n):
    for j in range(i):
        if arr[j] < arr[i]:
            dp[i] = max(dp[i], dp[j] + arr[i])
        else:
            dp[i] = max(dp[i], arr[i])

print(max(dp))

 

 입력 받은 수열과 같은 길이의 dp 공간을 만든다. dp[i]는 0번째 부터 i번째 까지 탐색 할 때, arr[i]를 무조건 포함하는 가장 큰 증가하는 부분 수열의 합이다. 

 다만 탐색할 때, 자신보다 작은 숫자가 어디서 나올 지 모르므로 자신의 앞에 위치한 값들을 전부 탐색해줘야 한다. 그러므로 시간복잡도가 약간 높게 나왔다.

반응형

'BOJ' 카테고리의 다른 글

[Python] 백준 14381, 14382: 숫자세는 양  (1) 2024.07.17
[Python] 백준 3213: 피자  (0) 2024.07.12
[Python] 백준 1182: 부분수열의 합  (1) 2024.07.05