백준 No.1912 [연속합]
본문 바로가기
Algorithm (C++ based)/BOJ

백준 No.1912 [연속합]

by 조훈이 2021. 2. 2.

Baekjoon Online Judge No.1912 [연속합]


   Problem   

 

1912번: 연속합

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

www.acmicpc.net


   Code   

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
31
32
33
34
35
36
#include <iostream>
#include <vector>
 
using namespace std;
 
int N;
vector<int> nums;
 
void input() {
    cin >> ::N;
    nums.assign(N, 0);
 
    for (int i = 0; i < N; i++)
        cin >> nums[i];
}
 
int solve() {
    vector<int> dp(N, 0);
 
    dp[0= nums[0];
    int ans = dp[0];
 
    for (int i = 1; i < N; i++) {
            dp[i] = max(nums[i], nums[i] + dp[i - 1]);
            ans = max(ans, dp[i]);
    }
 
    return ans;
}
 
int main() {
    input();
    
    int ans = solve();
    cout << ans;
}
cs

   How to solve   

  만약 수열의 모든 수가 양수라면 모조리 다 더해버린다면 그 값이 답이 될 것이다. 그 말은 즉, 수열에서 음수에 대해서 만 잘 처리하면 된다는 말이 될 것이다. 그렇다면 이 문제의 점화식을 세우기 위해 고려해볼 사항은 다음과 같다.

 

  • case A) dp[ i ] = nums[ i ] + dp[ i - 1 ] 로 계속 더하는게 제일 큰가?
  • case B) dp[ i ] = nums[ i ] 로 새로 더해나가는게 제일 큰가?

  그리고 이 사항에 대해선 다음과 같이 정리할 수 있다.

사진을 클릭하면 더 선명하게 보실 수 있습니다 :)

  결국, 이 경우들에 대해선 모두 dp[ i ] = nums[ i ] 아니면 dp[ i ] = nums[ i ] + dp[ i - 1 ] 이 됨을 알 수 있다. 따라서 dp[ i ]의 값은 위 코드 24번째 line 과 같이 max(nums[ i ], nums[ i ] + dp[ i - 1 ]) 가 된다.

728x90

'Algorithm (C++ based) > BOJ' 카테고리의 다른 글

BOJ No.2798 [블랙잭]  (0) 2021.02.05
백준 No.11049 [행렬 곱셈 순서]  (0) 2021.02.04
백준 No.2603 [색종이 만들기]  (0) 2021.01.24
백준 No.2447 [별 찍기 - 10]  (0) 2021.01.24
백준 No.10757 [큰 수 A+B]  (0) 2021.01.05

댓글