티스토리 뷰

PS

백준 1912. 연속합

tose33 2021. 3. 4. 18:40

www.acmicpc.net/problem/1912

 

1912번: 연속합

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

www.acmicpc.net

 

다시 푼 문제.

이전 글: tose33.tistory.com/22

 

 

  1 2 3 4 5 6 7 8 9 10
a 2 1 -4 3 4 -4 6 5 -5 1
d 2 3 -1 3 7 3 9 14 9 10

 

a[i-1] + a[i] 와 a[i] 를 비교해서 큰 값이 d[i]이다.

예를들어 현재 a[3]를 계산중이라고 해보자.

d[2]에는 n = 2 까지의 연속합 중 최대값이 저장되 있고 d[2] = 3이다. 

이제 d[2]에 a[3]을 더한값과 그냥 d[2]중 큰값이 d[3]이 된다.

d[2] + a[3] = -1 이고

a[3] = -4 이므로

d[3] = -1 이다.

 

이제 a[4]를 비교하면

d[3] = -1 이다. 즉 a[3]까지의 연속합 중 최댓값이 -1 이라는 뜻이다.

d[3] + a[4] = 2 이고 a[4] = 3 이므로 d[4] = 3 이다.

 

즉 d[i-1]은 a[i-1]까지의 연속합 중 최댓값이 보장되있으므로 (저장되있으므로)

d[i-1]에 a[i]를 더하면 값이 더 커질지 안커질지를 판단하는 것이다. 

더 커진다면 지금까지의 연속합(d[i-1])에 a[i]를 더하면 되는것이고, 

작아진다면 연속합은 끊기고 d[i]는 a[i]가 되는 것이다. (새로운 연속 시작)

#include <iostream>
using namespace std;

int a[100001];
int d[100001];

int main() {
    int n;
    cin >> n;

    for(int i = 1; i <= n; i++) cin >> a[i];
    d[1] = a[1];

    int ans = d[1];
    for(int i = 2; i <= n; i++) {
        if(d[i-1] + a[i] > a[i]) d[i] = d[i-1] + a[i];
        else d[i] = a[i];

        ans = max(ans, d[i]);
    }

    cout << ans;

}

'PS' 카테고리의 다른 글

백준 9184. 신나는 함수 실행  (0) 2021.03.09
백준 1003. 피보나치 함수  (0) 2021.03.06
백준 11055. 가장 큰 증가 부분수열  (0) 2021.03.04
백준 11054. 가장 긴 바이토닉 부분 수열  (0) 2021.03.02
백준 9465. 스티커  (0) 2021.03.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함