Python/코딩 문제
[백준] 13398. 연속합 2
green_ne
2022. 3. 10. 07:43
# 문제 설명
n개의 정수로 이루어진 임의의 수열이 주어질 때, 이 중 연속된 몇 개의 수를 선택하여 구할 수 있는 합 중 가장 큰 합을 구하려고 한다.
수는 한 개 이상 선택해야 하며, 수열에서 수를 하나 제거할 수 있다. (또한 제거하지 않아도 된다.)
# 입출력 예시
입력 | 출력 |
10 10 -4 3 1 5 6 -35 12 21 -1 |
54 |
# 내 풀이
n = int(input())
li = list(map(int, input().split(' ')))
li.remove(min(li)) # ?
dp = max(max(li), sum(li))
for i in range(2, n):
for j in range(n-i+1):
dp = max(dp, sum(li[i:j+i]))
print(dp)
-> 시간 초과 && 제거하지 않았을 때 고려 X
# 정답 : O(n) 풀이
n = int(input())
li = list(map(int, input().split(' ')))
dp = [[0]*n for _ in range(2)]
dp[0][0] = li[0]
if n < 2:
print(dp[0][0])
else:
answer = 0
for i in range(1, n):
dp[0][i] = max(dp[0][i-1] + li[i], li[i]) # 특정 원소를 제거하지 않는 경우
dp[1][i] = max(dp[0][i-1], dp[1][i-1] + li[i]) # 특정 원소를 제거하는 경우
answer = max(answer, dp[0][i], dp[1][i])
print(answer)
# 핵심 포인트
- 특정 원소를 제거한 경우와 그렇지 않은 경우 모두 고려해야 할 대상이기 때문에, 병렬적으로 처리해주어야 한다.
- DP로 꾸준히 이전 노드까지의 연속하는 최대 합을 저장한다.
- answer에는 특정 원소를 제거한 경우나 그렇지 않은 경우 또는 이전 answer 중 최적의 값으로 계속 업데이트 해준다.
반응형