문제
n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중
가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.
예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.
입력
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다.
수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
출력
첫째 줄에 답을 출력한다.
더보기
예제 입력 1
10
10 -4 3 1 5 6 -35 12 21 -1
예제 출력 1
33
예제 입력 2
10
2 1 -4 3 4 -4 6 5 -5 1
예제 출력 2
14
예제 입력 3
5
-1 -2 -3 -4 -5
예제 출력 3
-1
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 1;
int arr[N];
int dp[N];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int result;
int n;
cin >> n;
for(int i=0; i<n; i++) {
cin >> arr[i];
}
dp[0] = arr[0];
result = dp[0];
for(int i=1; i<n; i++) {
dp[i] = max(dp[i-1] + arr[i], arr[i]);
result = max(result, dp[i]);
}
cout << result << '\n';
return 0;
}
알고리즘은 간단하다.
일단 dp[0]을 arr[0]으로 초기화 시켜준다.
보통 문제에선 0으로 초기화 할 경우 비교하면서 최댓값을 구할 수 있지만, 이 문제의 경우엔 음수가 껴있기 때문이다.
그리고나서 반복문을 돌면서 dp[i]는 여태까지 더한수와 입력받은 배열의 수를 더한 수와 배열에 있는수를 비교해서
더 큰수로 할당한다.
result도 dp[i-1]과 dp[i]를 비교해서 더 큰수를 찾는다.
'PS > 백준' 카테고리의 다른 글
백준 / 다이나믹 프로그래밍 / 11053번 / 가장 긴 증가하는 부분 수열 / C++ (0) | 2021.08.31 |
---|---|
백준 / 다이나믹 프로그래밍 / 2225번 / 합분해 / C++ (0) | 2021.08.30 |
백준 / 다이나믹 프로그래밍 / 2193번 / 이친수 / C++ (0) | 2021.08.26 |
백준 / 다이나믹 프로그래밍 / 10844번 / 쉬운 계단 수 / C++ (0) | 2021.08.25 |