𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 1912번: 연속합 - C++ λ³Έλ¬Έ

μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[λ°±μ€€] 1912번: 연속합 - C++

.23 2021. 7. 29. 01:19
문제

n개의 μ •μˆ˜λ‘œ 이루어진 μž„μ˜μ˜ μˆ˜μ—΄μ΄ 주어진닀. μš°λ¦¬λŠ” 이 쀑 μ—°μ†λœ λͺ‡ 개의 수λ₯Ό μ„ νƒν•΄μ„œ ꡬ할 수 μžˆλŠ” ν•© 쀑 κ°€μž₯ 큰 합을 κ΅¬ν•˜λ €κ³  ν•œλ‹€. 단, μˆ˜λŠ” ν•œ 개 이상 선택해야 ν•œλ‹€.

예λ₯Ό λ“€μ–΄μ„œ 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 μ΄λΌλŠ” μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œλ‹€κ³  ν•˜μž. μ—¬κΈ°μ„œ 정닡은 12+21인 33이 정닡이 λœλ‹€.

 

μž…λ ₯

첫째 쀄에 μ •μˆ˜ n(1 ≤ n ≤ 100,000)이 주어지고 λ‘˜μ§Έ μ€„μ—λŠ” n개의 μ •μˆ˜λ‘œ 이루어진 μˆ˜μ—΄μ΄ 주어진닀. μˆ˜λŠ” -1,000보닀 ν¬κ±°λ‚˜ κ°™κ³ , 1,000보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 닡을 좜λ ₯ν•œλ‹€.


DPλ₯Ό μ΄μš©ν•˜μ—¬ ν’€ 수 μžˆλŠ” 문제. μ•žμ„œ ν’€μ—ˆλ˜ LIS λ¬Έμ œλ“€μ—μ„œ 쑰금만 μ‘μš©ν•˜λ©΄ ν’€ 수 μžˆλ‹€.

nκΉŒμ§€μ˜ μˆ˜μ—΄μΈ A[]와 뢀뢄합을 κΈ°λ‘ν•˜λŠ” λ°°μ—΄ D[]λ₯Ό μ„ μ–Έν•œλ‹€. 전체λ₯Ό λŒλ©΄μ„œ (i - 1)κΉŒμ§€μ˜ μ΅œλŒ€κ°€ λ˜λŠ” λΆ€λΆ„ν•©(D[i - 1])에 A[i]λ₯Ό λ”ν•œ μž„μ‹œ μ΅œλŒ€ λΆ€λΆ„ν•©κ³Ό A[i] 자기 μžμ‹ μ˜ 값을 λΉ„κ΅ν•œ λ’€, A[i]κ°€ 더 크닀면 μ§€κΈˆκΉŒμ§€μ˜ 뢀뢄합은 λͺ¨λ‘ 버렀지고, A[i]λΆ€ν„° λ‹€μ‹œ μ‹œμž‘ν•˜μ—¬ 뢀뢄합을 κ΅¬ν•œλ‹€. 그리고 ν˜„μž¬ μ΅œλŒ“κ°’μœΌλ‘œ κΈ°λ‘λ˜μ–΄μžˆλŠ” κ°’κ³Ό λΉ„κ΅ν•˜μ—¬ μ΅œλŒ€ 합을 κ°±μ‹ ν•œλ‹€. 이λ₯Ό λ‹€μ‹œ μˆœμ„œλŒ€λ‘œ ν‘œν˜„ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

1. D[i] 기둝

    1-1. A[i] ≤ D[i - 1] + A[i], D[i] = D[i - 1] + A[i]

    1-2. A[i] > D[i - 1] + A[i], D[i] = A[i]

2. 기쑴의 μ΅œλŒ“κ°’κ³Ό λΉ„κ΅ν•˜μ—¬ μ΅œλŒ€ν•© 기둝

 

μ½”λ“œ
#include <cstdio>
#include <vector>

using namespace std;

int DP(int num);
int max(int a, int b) { return a > b ? a : b; }

int main(void) {
    int n;
    scanf("%d", &n);
    printf("%d\n", DP(n));
    return 0;
}

int DP(int num) {
    vector<int> A(num + 1, 0);
    vector<int> D(num + 1, 0);

    for(int i = 1; i <= num; i++) {
        scanf("%d", &A[i]);
    }

    int result = A[1];

    for(int i = 1; i <= num; i++) {
        D[i] = max(A[i], D[i - 1] + A[i]);
        result = max(result, D[i]);
    }

    return result;
}
Comments