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 |