본문 바로가기
알고리즘

BOJ 1912 - 연속합(C++)

by 장중앙 2021. 10. 5.

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

 

1912번: 연속합

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

풀이

연속된 수에 대한 최대값이기 때문에 2가지만 고려함

1. 연속하지 않을 때

  - 이전 값과 연속할 때 현재 값보다 작은 경우, 자기 자신을 가지고 감

  - dp[i] > (dp[i-1] + dp[i])

2. 연속할 때

  - 이전 값과 연속할 때 현재 값보다 큰 경우, 연속합을 가지고 감

  - dp[i] < (dp[i-1] + dp[i])

 

순서대로 탐색하며 1, 2를 적용하고 최대값을 갱신 

 

#include <iostream>
#include <algorithm>

#define MIN -987654321

using namespace std;

int dp[100001];

int main() {
    int N;
    int answer = MIN;
    
    cin >> N;
    for (int i = 1; i <= N; i++) {
        cin >> dp[i];
    }
    
    dp[0] = MIN;
    for (int i = 1; i <= N; i++) {
        dp[i] = max(dp[i], dp[i - 1] + dp[i]);
        answer = answer < dp[i] ? dp[i] : answer;
    }

    cout << answer;

    return 0;
}

'알고리즘' 카테고리의 다른 글

BOJ 2615 - 오목(C++)  (0) 2021.10.05
BOJ 14889 - 스타트와 링크(C++)  (0) 2021.10.05
Programmers - 불량 사용장(Python)  (0) 2021.10.04
Programmers - 복서 정렬하기(C++)  (0) 2021.10.04
Programmers - 모음사전(Python)  (0) 2021.09.29

댓글