본문 바로가기

Python 코딩테스트

DP(다이나믹 프로그래밍): 백준 1912 파이썬 연속합

반응형

문제:

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

 

1912번: 연속합

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

풀이:

항상 느끼는 거지만 다이나믹 프로그래밍 문제는 코드는 정말 간단하지만 규칙과 점화식을 생각해내는 

과정이 너무 어렵다. 이 문제도 연속합을 어떻게 구하는지 생각해내는 게 어려웠고, 코드는 간단했다.

 

반복문을 돌려 dp 배열에 저장되어있는 앞 값들의 연속합 + 현재 값현재 값 중 큰 것을 골라서 dp 배열에

저장해나가면 된다.

 

  • 10, -4, 3, 1, 5, 6, -35, 12, 21, -1

다음과 같이 이루어진 배열을 입력 받았을 때, 현재 값이 12일 때를 생각해보자. * 답은 33(12+21)이다.

앞에서부터 저장되어온 가장 큰 연속합은 dp[6]이고, 현재 값은 arr[7]이다.

가장 큰 연속합을 구하기 위해서는 dp[6] + arr[7]과 arr[7] 중 더 큰 값을 골라 저장해주면 되는데,

답을 보면 dp[6] + arr[7]이 아닌 arr[7]이 선택되었음을 알 수 있다. 누적되어온 연속합 + 현재 값이 현재 값

12보다 작기 때문.

 

정답:

import sys
input = sys.stdin.readline

n = int(input())
arr = list(map(int, input().split()))
dp = [0] * n
dp[0] = arr[0]

for i in range(1, n):
    dp[i] = max(dp[i-1] + arr[i], arr[i],)

print(max(dp))
반응형