<문제>
문제
n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 숫자를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 숫자는 한 개 이상 선택해야 한다.
예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.
입력
첫째 줄에 정수 n(1≤n≤100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
출력
첫째 줄에 답을 출력한다.
예제 입력 복사
10
10 -4 3 1 5 6 -35 12 21 -1
예제 출력 복사
33
출처: <https://www.acmicpc.net/problem/1912>
<코드>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(int argc, char* argv[]) {
int arr[100001] = { 0, };
int dp[100001] = { 0, };
int n;
int max;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
}
for (int i = 1; i <= n; i++) {
if (dp[i - 1] + arr[i] > arr[i]) {
dp[i] = dp[i - 1] + arr[i];
}
else {
dp[i] = arr[i];
}
}
max = dp[1];
for (int i = 2; i <= n; i++) {
if (max < dp[i]) {
max = dp[i];
}
}
printf("%d\n", max);
return 0;
}
<풀이>
1. 두가지의 경우로 나누어 진다.
2. 경우 1 : 이전의 값을 더한것과 지금의 값을 더한 값이 최대.
3. 경우 2 : 이전의 값을 더하지 않고 현재의 값만이 최대.
'Computer Science > Algorithm' 카테고리의 다른 글
[Algorithm/C] BOJ.1924 2007년 (1) | 2018.02.19 |
---|---|
[Algorithm/C] BOJ.2558 A+B-2 (0) | 2018.02.17 |
[Algorithm/C] BOJ.11721 열 개씩 끊어 출력하기 (0) | 2018.02.13 |
[Algorithm/C] BOJ.2156 포도주 시식 (0) | 2018.02.12 |
[Algorithm/C] BOJ.9205 맥주 마시면서 걷기 (1) | 2018.02.10 |