Algorithm/백준
[백준][1912번] 연속합
1일1코딩
2020. 3. 25. 22:49
https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
풀이과정
연속 된 부분 수열 중 최대값을 구하는 문제이다.
dp[N] 에는 map[1] ... map[N]까지의 합 또는 map[N]값중 더 큰 값을 저장시켰다.
dp[N-1]이 음수인 경우 map[N]이 더 크기 때문이다. (if map[N] > 0)
dp[N] = max((dp[N-1] + map[N]) , map[N]) 과 같은 점화식을 구 할 수 있었다.
소스코드
더보기
#include <stdio.h>
int dp[100001];
int map[100001];
int N;
int solution()
{
int answer = map[0];
dp[0] = map[0];
for (int i = 0; i < N; i++) {
dp[i] = map[i];
if (dp[i - 1] + dp[i] > dp[i]) {
dp[i] = dp[i] + dp[i - 1];
}
if (answer < dp[i]) {
answer = dp[i];
}
}
return answer;
}
int main()
{
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", &map[i]);
}
printf("%d\n", solution());
}