알고리즘/백준

[BOJ#1912] 연속합

Jinoo.keem 2024. 6. 10. 23:06
728x90

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

1 초 (추가 시간 없음) 128 MB 146012 55843 39788 36.817%

문제

n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.

예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.

입력

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

출력

첫째 줄에 답을 출력한다.


제출 코드

n = int(input())
num = list(map(int, input().split()))


dp = [0] * n
dp[0] = num[0]

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

현재 순간의 최적해를 구하면 되는 문제..

dp[i-1] + num[i] < num[i] 라면 dp[i]에 num[i]를 저장하는 방법으로 초기화하여 이후의 최댓값을 다시 구하고,

dp[i-1] + num[i] > num[i] 라면 dp[i]에 연속해서 더하던 값인 dp[i-1] + num[i] 값을 더해가면서 최대값을 저장한다.

 

제출 코드(오답)

n = int(input())
num = list(map(int, input().split()))


dp = [-10e9] * n
dp[0] = num[0]

cnt = 1
while cnt < n:
    check = [0] * n
    check[0] = num[0]
    for i in range(cnt, n):
        check[i] = check[i-1] + num[i]
        if dp[cnt] <= check[i]:
            dp[cnt] = check[i]
            
    cnt += 1
    
print(max(dp))

처음 풀땐 리스트 두개로 비교하면서 최대값을 찾는 방법으로 했는데

이중 반복문에 완전탐색이라서 최악의 시간복잡도가 나온것 같아 다시 생각하는 시간을 가졌다.

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ#16198] 에너지 모으기 (Python, NodeJS)  (0) 2024.06.18
[BOJ#2210] 숫자판 점프  (2) 2024.06.11
[BOJ#15686] 치킨 배달  (1) 2024.06.07
[BOJ#1149] RGB거리  (1) 2024.06.04
[BOJ#15663] N과 M (9)  (0) 2024.05.28