티스토리 뷰
연속된 수들의 합 중 최대값을 구하는 문제
문제의 조건
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 최대값이 10만인 것이 좀 걸렸지만.. 일단(생각나는 것이 이거 뿐이라 ^_ㅠ) O(N^2)으로 풀어 보았는데... 역시 시간초과가 났습니다 ㅠ.ㅠ 시간을 단축시킬 풀이를 떠올리지 못 했기 때문에 구글링을 하여 O(N)으로 푸는 풀이법을 알게 되었습니다.
풀이에 참고한 블로그. 친절하게 한 단계씩 설명되어 있습니다.
1. 연속된 수들의 합을 구하면 되기 때문에 i-1번째 원소까지의 합과 i번째 원소를 더하는 것이 핵심이다.
2. 만약 i-1번째 원소까지의 합과 i번째 원소의 합이 i번째 원소보다 작으면 그것은 n개의 수의 최대합이라 할 수 없다. 이 때의 최대합은 i번째 원소가 된다. i-1번째 원소까지의 합과 i번째 원소의 합이 i번째 원소보다 크면 그것이 n개의 수의 최대합이다.
3. DP 배열을 만들어 반복문으로 DP 배열의 인덱스에 2번에서 얻을 수 있는 최대합을 기록한다.
4. DP 배열 중 최대값을 출력한다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> numbers(n, 0);
for (int i = 0; n > i; i++)
cin >> numbers[i];
vector<long> DP(n, 0);
DP[0] = numbers[0];
for (int i = 1; DP.size() > i; i++)
{
//i-1번째까지의 누적합과 i번째 원소를 더한 값이 i보다 크면 최대 누적합
if (DP[i-1] + numbers[i] > numbers[i])
DP[i] = DP[i-1] + numbers[i];
else //작으면 i번째 원소가 최대합
DP[i] = numbers[i];
}
cout << *max_element(DP.begin(), DP.end());
return 0;
}
'알고리즘 문제 풀이 > DP' 카테고리의 다른 글
[C++] 백준 온라인 저지 2748번 피보나치 수 2 풀이 (0) | 2021.11.14 |
---|---|
[C++] 백준 온라인 저지 2156번 포도주 시식 풀이 (0) | 2021.11.14 |
[C++] 백준 온라인 저지 1932번 정수 삼각형 풀이 (0) | 2021.11.11 |
[C++] 백준 온라인 저지 11053번 가장 긴 증가하는 부분 수열 풀이 (0) | 2021.11.09 |
[C++] 백준 온라인 저지 11726번 2xn 타일링 풀이 (0) | 2021.11.07 |
- Total
- Today
- Yesterday
- 아이패드
- 하드웨어
- 깊이우선탐색
- 캐나다
- 캐나다생활
- 다이나믹프로그래밍
- dp
- 백준
- 해커랭크
- c++
- 문제풀이
- DFS
- 코딩공부
- 컴퓨터
- 기초
- BFS
- hackerrank
- 영어공부
- 스위프트플레이그라운드
- 프로그래밍
- 컴퓨터사이언스
- C언어기초
- 애플
- 너비우선탐색
- greedy
- 그리디
- c언어
- 알고리즘
- 컴퓨터공부
- 프로그래머스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |