PS/C++

[λ°±μ€€/C++] 13398번 연속합 2

yulee_to 2022. 7. 20. 22:58
728x90

λ°±μ€€


πŸ€”λ¬Έμ œ 이해

μ—°μ†λœ λͺ‡ 개의 수λ₯Ό μ„ νƒν–ˆμ„ λ•Œ κ·Έ 합이 κ°€μž₯ 큰 μˆ˜μ—΄μ˜ 합을 좜λ ₯ν•˜λŠ”λ° κ·Έ μˆ˜μ—΄ μ€‘μ—μ„œ ν•˜λ‚˜λ₯Ό 없앨 수 μžˆλŠ” λ¬Έμ œμ΄λ‹€.


πŸ’‘μ²«λ²ˆμ§Έ 아이디어

ν•˜λ‚˜λ₯Ό μ–΄λ–»κ²Œ μ—†μ•¨κΉŒ ν•˜λ‹€κ°€ λ°”λ‘œ 전에 ν‘Ό κ°€μž₯ κΈ΄ 바이토닉 λΆ€λΆ„ μˆ˜μ—΄μ΄ λ– μ˜¬λžλ‹€.

μ•žμ—μ„œ μˆœμ„œλŒ€λ‘œ 합이 κ°€μž₯ 큰 연속합1을 ꡬ해주고, λ’€μ—μ„œ μˆœμ„œλŒ€λ‘œ 합이 κ°€μž₯ 큰 연속합2을 ꡬ해주고 μ–΄λŠ 숫자λ₯Ό κΈ°μ€€μœΌλ‘œ μ–‘μ˜†μœΌλ‘œ 연속합1κ³Ό 2λ₯Ό λ”ν•œ 값이 κ°€μž₯ 크닀면 κ·Έ κΈ°μ€€ 숫자λ₯Ό μ—†μ•€ 것이 더 큰거고, 연속합1의 μ΅œλŒ“κ°’μ΄ κ°€μž₯ 크닀면 ν•˜λ‚˜λ₯Ό μ—†μ• μ§€ μ•Šμ•„λ„ κ°€μž₯ 큰 연속합을 ꡬ할 수 μžˆλŠ” 것이라고 μƒκ°ν•΄μ„œ ν’€μ—ˆλ‹€. 

 

πŸ”₯풀이πŸ”₯

dp[i]λŠ” i번째 수λ₯Ό λ§ˆμ§€λ§‰ 수둜 ν–ˆμ„ λ•Œ κ°€μž₯ 큰 연속합을 μ˜λ―Έν•œλ‹€.

dp2[i]λŠ” i번째 수λ₯Ό 첫번째 수둜 ν–ˆμ„ λ•Œ κ°€μž₯ 큰 연속합을 μ˜λ―Έν•œλ‹€.

 

1. dp와 dp2λ₯Ό λͺ¨λ‘ μž…λ ₯된 μˆ˜μ—΄λ‘œ μ΄ˆκΈ°ν™”ν•˜κ³ , 0번째 dpλ₯Ό maxInt둜 μ΄ˆκΈ°ν™”ν•œλ‹€.

2. iλŠ” 1λΆ€ν„° n-1κΉŒμ§€λ‘œ dp[i]와 dp[i-1]+arr[i]κ³Ό λΉ„κ΅ν•΄μ„œ 더 큰 값을 dp[i]에 λ„£μ–΄μ£Όκ³ , maxInt와 dp[i]λ₯Ό 비ꡐ해 더 큰 값을 maxInt에 λ„£μ–΄μ€€λ‹€.

3. iλŠ” n-2λΆ€ν„° 0κΉŒμ§€λ‘œ dp2[i]와 dp2[i+1]+arr[i]κ³Ό λΉ„κ΅ν•΄μ„œ 더 큰 값을 dp2[i]에 λ„£μ–΄μ£Όκ³ , maxInt와 dp2[i]λ₯Ό 비ꡐ해 더 큰 값을 maxInt에 λ„£μ–΄μ€€λ‹€.

4. dp2의 n-1번째 κ°’κ³Ό dp2[0]번째 값을 maxInt와 비ꡐ해 더 큰 값을 maxInt에 λ„£μ–΄μ€€λ‹€.

5. iλŠ” 1λΆ€ν„° n-1κΉŒμ§€λ‘œ i번째 숫자λ₯Ό μ œμ™Έν•œ dp[i-1]+dp2[i+1]의 값을 maxInt와 비ꡐ해 더 큰 값을 maxInt에 λ„£μ–΄μ€€λ‹€.

5. maxIntκ°’ 좜λ ₯!

 

 

βŒνŠΈλŸ¬λΈ” μŠˆνŒ…

maxIntλ₯Ό μ—…λ°μ΄νŠΈν•΄μ£ΌλŠ” 과정이 μ„Έμ„Έν•˜κ²Œ λ“€μ–΄κ°€μ•Ό ν–ˆλ‹€. 


#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

long long dp[100001];
long long dp2[100001];
long long arr[100001];
int n;
long long maxInt;

int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);

    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
        dp[i] = arr[i];
        dp2[i] = arr[i];
    }
    maxInt = dp[0];
    for (int i = 1; i < n; i++) {
        dp[i] = max(dp[i], dp[i - 1] + arr[i]);
        maxInt = max(maxInt, dp[i]);
    }

    for (int i = n - 2; i >= 0; i--) {
        dp2[i] = max(dp2[i], dp2[i + 1] + arr[i]);
        maxInt = max(maxInt, dp2[i]);
    }
    maxInt = max(maxInt, dp2[n-1]);
    maxInt = max(maxInt, dp2[0]);
    for (int i = 1; i < n; i++) {
        long long tmp = dp[i - 1] + dp2[i + 1];
        if (tmp > maxInt) maxInt = tmp;
    }
    cout << maxInt;

}
728x90