Computer Science/Algorithm

[Algorithm/C] BOJ.1912 연속합

재오니소스 2018. 2. 16. 17:25

<문제>

문제

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 : 이전의 값을 더하지 않고 현재의 값만이 최대.