728x90
반응형
https://www.acmicpc.net/problem/13398
13398번: 연속합 2
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
문제 해결
리스트안에서 i번째에서 j번째의 합의 최댓값을 구하는 문제 BUT 중간에 하나의 수를 뺄 수 있다.
n번째 까지 연속해서 왔을 때 최댓값은 n-1번째까지 수에 영향을 받으므로 dp를 이용하면 좋겠다는 것을 알 수 있다.
이는 처음부터 n 번째 수까지 나열했을 때 n까지 연속해서 오는동안 하나의 수도 안 뺀 최댓값을 dp[n][0],
중간에 하나 뺐으면 dp[n][1]으로 정의한다.
중간에 끊어지고 다시 처음부터 시작할 수도 있다. 그러므로 dp전체에서의 최댓값을 구해야 한다.
CODE
import sys
input = sys.stdin.readline
n = int(input())
num = [0]+list(map(int, input().split()))
dp = [[0, 0] for _ in range(n+1)]
dp[1][0] = num[1]
ans = dp[1][0]
for i in range(2,n+1):
dp[i][0] = max(dp[i-1][0]+num[i], num[i]) # 이어 붙이거나 새로 시작하던가
dp[i][1] = max(dp[i-1][1]+num[i], dp[i-1][0]) #이미 중간에 하나 수를 뺐던가 지금 n번째 수를 빼던가
ans = max(ans, dp[i][0], dp[i][1])
print(ans)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 11055 가장 큰 증가 부분 수열 (0) | 2022.12.29 |
---|---|
[python] 백준 11722 가장 긴 감소하는 부분 수열 (0) | 2022.12.29 |
[python] 백준 2133 타일 채우기 (0) | 2022.12.27 |
[python] 백준 9456 스티커 (0) | 2022.12.27 |
[python] 백준 17404 RGB거리2 (0) | 2022.12.26 |
댓글