[ 백준 ] 13398 / 연속합 2

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
76/228
post-thumbnail
post-custom-banner

# Appreciation

/*
 * Problem :: 13398 / 연속합 2
 *
 * Kind :: Dynamic Programming + Prefix Sum
 *
 * Insight
 * - 누적합인데...
 *   숫자하나를 뺄 수 있네?
 *   +    |-------------|
 *     A. --------------> // Left to Right
 *     B. <-------------- // Right to Left
 *     C. ----->X<------- // Left to Right + Right to Left
 *     위와 같은 방법으로 각각의 경우를 고려해주자

 * Point
 * - N=1 일때 조심하자
 *   + C 방법을 이때 사용하면
 *     수를 하나도 선택하지 않는 경우가 되어서
 *     0 과 같은 값으로 초기화 된 경우 오답이 나올 수 있다
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N; cin >> N;
    int A[N];
    for (int i=0; i<N; i++)
        cin >> A[i];

    // Process
    int l2r[N], r2l[N];
    memset(l2r, 0, sizeof(l2r));
    memset(r2l, 0, sizeof(r2l));

    /* Prefix Sum - Left to Right */
    l2r[0] = A[0];
    for (int i=1; i<N; i++) {
        l2r[i] = A[i] + ((l2r[i-1] < 0) ? 0 : l2r[i-1]);
    }
    /* Prefix Sum - Right to Left */
    r2l[N-1] = A[N-1];
    for (int i=N-2; i>=0; i--) {
        r2l[i] = A[i] + ((r2l[i+1] < 0) ? 0 : r2l[i+1]);
    }

    /* A, B 방법으로 max */
    int ans = max(*max_element(l2r, l2r+N), *max_element(r2l, r2l+N));
    /* C 방법으로 max */
    if (N > 1) {
        for (int i=0; i<N; i++) {
            if (i == 0) {
                ans = max(ans, r2l[1]); /* N=1 일 때, 인덱스 오류 */
            } else if (i == N-1) {
                ans = max(ans, l2r[N-2]);
            } else {
                ans = max(ans, l2r[i-1]+r2l[i+1]);
            }
        }
    }

    // Control : Output
    cout << ans << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이
post-custom-banner

0개의 댓글