# [DP] 13398. 연속합 2
Study Repository

[DP] 13398. 연속합 2

by rlaehddnd0422

 

 

13398번: 연속합 2

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

www.acmicpc.net

 

연속합 2 λ¬Έμ œλŠ” 연속합 1 λ¬Έμ œμ—μ„œ 숫자λ₯Ό ν•˜λ‚˜ λΊ€ κ²½μš°κΉŒμ§€ μ‘°μ‚¬ν•œλ‹€λŠ” μ μ—μ„œ 차이가 μžˆμŠ΅λ‹ˆλ‹€. 

 

1912번: 연속합

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

www.acmicpc.net

 

 

예λ₯Όλ“€μ–΄ μˆ˜μ—΄ Aκ°€ λ‹€μŒκ³Ό 같을 λ•Œ,

10 -4 3 1 5 6 -35 12 21 -1

 

연속합 1 λ¬Έμ œμ—μ„œλŠ” μˆ˜μ—΄μ—μ„œ λͺ‡κ°œμ˜ 수λ₯Ό μ„ νƒν•΄μ„œ λ”ν•˜μ˜€μ„ λ•Œ, κ°€μž₯ 큰 값을 문제라면

연속합 2 λ¬Έμ œμ—μ„œλŠ” μˆ˜μ—΄μ—μ„œ λͺ‡κ°œμ˜ 수λ₯Ό μ„ νƒν•˜λ˜ ν•˜λ‚˜μ˜ 수λ₯Ό μ œκ±°ν•  수 μžˆλŠ” κ²½μš°κΉŒμ§€ 계산해야 ν•©λ‹ˆλ‹€.

 

ν•„μžλŠ” 길이 N의 μˆ˜μ—΄μ— λŒ€ν•˜μ—¬

D[0][N] = 길이 NκΉŒμ§€μ˜ μˆ˜μ—΄ 쀑 연속합 1μ—μ„œ κ΅¬ν•œ μˆ˜μ—΄μ—μ„œ λͺ‡κ°œμ˜ 수λ₯Ό μ„ νƒν•˜μ—¬ μ œκ±°ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ μ΅œλŒ“κ°’ 

D[1][N] =  길이 NκΉŒμ§€μ˜ μˆ˜μ—΄ 쀑 0 ~ NκΉŒμ§€μ˜ 인덱슀 쀑 ν•˜λ‚˜μ˜ 수λ₯Ό μ œκ±°ν–ˆμ„ λ•Œ μ΅œλŒ“κ°’

을 κ³„μ‚°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

D[0][N] - 연속합 1 λ¬Έμ œμ™€ 동일

1) D[0][1] = v[0] 길이가 1인 μˆ˜μ—΄ 쀑 λͺ‡κ°œμ˜ 수λ₯Ό μ„ νƒν–ˆμ„ λ•Œ ν•©μ˜ μ΅œλŒ“κ°’ 

 

2) (0 ~ N-1 κΉŒμ§€μ˜ μ΅œλŒ€ 연속합 κ°’ + μˆ˜μ—΄μ˜ N번째 κ°’) < (μˆ˜μ—΄μ˜ N번째 κ°’) 인 경우 

: 0 ~ N-1κΉŒμ§€μ˜ μ΅œλŒ€ 연속합 κ°’ + μˆ˜μ—΄μ˜ N번째 값을 λ”ν•œ 값이 μˆ˜μ—΄μ˜ N번째 값보닀 μž‘λ‹€λ©΄ 0~N-1κΉŒμ§€μ˜ μ΅œλŒ€ 연속합 값은 μžŠμ–΄λ²„λ¦¬κ³ , μƒˆλ‘œ 연속합 μˆ˜μ—΄μ„ μ‹œμž‘ν•΄μ•Όκ² μ£ . λ”°λΌμ„œ D[N][0]은 μ—°μ†ν•© μˆ˜μ—΄μ˜ μ‹œμž‘μ΄ λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ D[0][N] 값을 μˆ˜μ—΄μ˜ N번째 κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

3) (0 ~ N-1 κΉŒμ§€μ˜ μ΅œλŒ€ 연속합 κ°’ + μˆ˜μ—΄μ˜ N번째 κ°’) >= (μˆ˜μ—΄μ˜ N번째 κ°’) 인 경우

: D[0][N]은 0~ N-1 κΉŒμ§€μ˜ μ΅œλŒ€ 연속합 κ°’μ—μ„œ μˆ˜μ—΄μ˜ N번째 값을 더해쀀 값이 λ©λ‹ˆλ‹€. 연속합 μˆ˜μ—΄μ„ μƒˆλ‘œ μ‹œμž‘ν•˜μ§€ μ•Šκ³  κ³„μ†ν•΄μ„œ λ”ν•΄μ€€λ‹€λŠ” 의미

 

4) λ„μΆœν•œ 점화식 D[0][N] = max(D[0][N-1] + v[N] , v[N])

 

1번째 점화식 κ΅¬ν˜„ μ½”λ“œ

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#define FASTio ios_base :: sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define endl '\n' 

using namespace std;

int n;

vector<int> v(100001,0);
int d[3][100001];
int ans = -1001;
int main()
{
    FASTio;
    cin >> n;
    
    for(int i=0;i<n;i++)
    {
        cin >> v[i];
    }

    d[0][0] = v[0];

    for(int i=1;i<n;i++)
    {       
        d[0][i] = max(v[i]+d[0][i-1],v[i]);
    }

 

μ§€κΈˆκΉŒμ§€ μ œκ±°ν•˜μ§€ μ•Šμ€ κ²½μš°μ— λŒ€ν•΄ 길이 NκΉŒμ§€μ˜ μˆ˜μ—΄μ˜ μ—°μ†ν•©μ˜ μ΅œλŒ“κ°’μ„ D[0][N]에 κ΅¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

이제 D[1][N] =  길이 NκΉŒμ§€μ˜ μˆ˜μ—΄μ—μ„œ 0 ~ NκΉŒμ§€μ˜ 인덱슀 쀑 ν•˜λ‚˜μ˜ 수λ₯Ό μ œκ±°ν–ˆμ„ λ•Œ μˆ˜μ—΄ μ—°μ†κ°’μ˜ μ΅œλŒ“값을 κ΅¬ν•΄λ΄…μ‹œλ‹€.

 

 

 

 

1) D[1][1] = 인덱슀 1~1κΉŒμ§€ 1개의 수λ₯Ό μ œκ±°ν–ˆμ„ λ•Œ μ΅œλŒ“κ°’ ( 1번째 인덱슀λ₯Ό μ§€μš°κ²Œ λ˜μ–΄ 0이라고 μƒκ°ν–ˆλŠ”λ° 0을 λŒ€μž…ν•˜κ³  μ±„μ ν•΄λ³΄λ‹ˆ ν‹€λ ΈμŠ΅λ‹ˆλ‹€. 문제의 μ‘°κ±΄μ—λŠ” 이 쑰건이 μ œμ‹œλ˜μ–΄ μžˆμ§€ μ•Šμ§€λ§Œ, μ•„λ§ˆλ„ 길이가 2이상일 λ•Œλ§Œ μ œκ±°ν•  수 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ ) 

 

2) D[1][2] = 1~2κΉŒμ§€ 인덱슀 쀑 1개 μ œκ±°μ‹œ 연속 μˆ˜μ—΄μ˜ μ΅œλŒ“κ°’ = 10 ( 2번째 인덱슀 값을 μ§€μ›Œμ„œ 10 )

 

3) D[1][3] = 1~3κΉŒμ§€ 인덱슀 쀑 1개 μ œκ±°μ‹œ 연속 μˆ˜μ—΄μ˜ μ΅œλŒ“κ°’  = 13 ( 2번째 인덱슀 값을 μ§€μ›Œ 13 )

 

...

 

7) D[1][7] = 1~7κΉŒμ§€ 인덱슀 쀑 1개 μ œκ±°μ‹œ 연속 μˆ˜μ—΄μ˜ μ΅œλŒ“κ°’ = 21 ( 7번째 인덱슀 값을 지웠을 경우 )

 

 N번째 인덱슀 값을 μ œκ±°ν•œ 경우의 연속 μˆ˜μ—΄μ˜ μ΅œλŒ“κ°’μ€
0~N-1 쀑 아무것도 μ œκ±°ν•˜μ§€ μ•Šμ•˜μ„ 경우 연속 μˆ˜μ—΄μ˜ μ΅œλŒ“κ°’κ³Ό κ°™μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ D[0][N-1]라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ”°λΌμ„œ 점화식은 D[1][N] = max(v[N] + D[1][N-1], D[0][N-1])으둜 μœ λ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2번째 점화식 κ΅¬ν˜„ μ½”λ“œ 

d[1][0] = v[0];

for(int i=1;i<n;i++)
{
    d[1][i] = max(d[1][i-1] + v[i], d[0][i-1]); 
}

 

 

λ§ˆμ§€λ§‰μœΌλ‘œ 첫번째 μ ν™”μ‹μ—μ„œ 1~NκΉŒμ§€μ˜ D[0][N]의 μ΅œλŒ“κ°’κ³Ό, λ‘λ²ˆμ§Έ μ ν™”μ‹μ—μ„œ 1~NκΉŒμ§€μ˜ D[1][N]의 μ΅œλŒ“κ°’μ„ κ΅¬ν•˜κ³ , 이 두 μ΅œλŒ“κ°’ 을 λΉ„κ΅ν•˜μ—¬ 더 큰 값이 정닡이 λ˜κ² μŠ΅λ‹ˆλ‹€.

전체 μ†ŒμŠ€ μ½”λ“œ

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#define FASTio ios_base :: sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define endl '\n' 

using namespace std;

int n;

vector<int> v(100001,0);
int d[3][100001];
int ans = -1001;
int main()
{
    FASTio;
    cin >> n;
    
    for(int i=0;i<n;i++)
    {
        cin >> v[i];
    }

    d[0][0] = v[0];
    for(int i=1;i<n;i++)
    {       
        d[0][i] = max(v[i]+d[0][i-1],v[i]);
    }

    d[1][0] = v[0];
    for(int i=1;i<n;i++)
    {
        d[1][i] = max(d[1][i-1] + v[i], d[0][i-1]); 
    }

    for(int i=0;i<2;i++)
    {
        for(int j=0;j<n;j++)
        {
            ans = max(ans,d[i][j]);
        }
    }
    cout << ans;
    return 0;
}

 

 

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°