반응형
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 |