[BOJ] 13398 연속합 2

2018. 9. 12. 15:24

1. 문제링크

https://www.acmicpc.net/problem/13398


2. 해설

이 문제는 연속합 1과는 다르게 차원을 하나 더 설정해서 풀어줘야 한다.

내가 지금까지 더한 값이 하나를 빼고 더한 것인가 아니면 빼지 않은 채로 더한 것인가를 따로 저장하면서 다녀야한다.


1. 처음 초기화를 한다.

2. dp[0]은 빼지 않고 더한 값, dp[1]은 빼고 더한 값들 중 최적을 저장하고 다닌다.

3. dp 배열 안에 가장 큰 값을 출력한다.


3. 소스코드

#include<iostream>
#include<algorithm>
#define MAXNUM 100100
using namespace std;

int arr[MAXNUM]={0};
int dp[2][MAXNUM]={0};

int main() {
    int n, ans= -1010;
    scanf("%d", &n);
    for (int i=0; i<n; i++) {
        scanf("%d", &arr[i]);
    }
    
    dp[0][0] = arr[0];
    dp[0][1] = (arr[0] + arr[1] > 0) ? arr[0] + arr[1] : max(arr[0], arr[1]);
    dp[1][1] = arr[1];
    
    ans = max({dp[0][0], dp[0][1], dp[1][1]});
    
    for (int i=2; i<n; i++) {
        dp[0][i] = max(0, dp[0][i-1]) + arr[i];
        dp[1][i] = max(dp[0][i-2], dp[1][i-1]) + arr[i];
        ans = max({ans, dp[0][i], dp[1][i]});
    }
    
    printf("%d\n", ans);
    
    return 0;
}


4. 추가언급

전부 다 음수일 때가 문제가 될 수 있다. 이 경우를 방지하기 위해서 음수가 되면 앞의 값과 현재 num[i]의 값중에서 더 큰 값을 출력해준다. 그렇게 하면 전부 다 음수일 때는 num 배열중에 가장 큰 값을 찾아낼 수 있다.

'프로그래밍 > 문제풀이(boj)' 카테고리의 다른 글

[BOJ] 1005 ACM Craft  (0) 2018.10.11
[BOJ] 2229 조짜기  (0) 2018.09.12
[BOJ] 10845 큐  (0) 2018.09.11
[BOJ] 1697 숨바꼭질  (0) 2018.09.11
[BOJ] 2096 내려가기  (0) 2018.09.07

BELATED ARTICLES

more