본문 바로가기
Algorithm/동적계획법

[백준] 1912 연속합 c++

by 젊은오리 2022. 2. 15.
728x90

 

문제 링크 https://www.acmicpc.net/problem/1912

KEY

  • i-1번째까지의 수열의 합에 i번째 숫자를 더해도 i번째 숫자보다 작다면 차라리 i번째 숫자부터 다시 세는 것이 낫다.

 

수열 {10, -4, -9, 8}로 예를 들어보자.

  • 처음은 10이다. 최댓값은 10 그대로일 것이다.
  • 두번째 -4로 왔다. 최댓값은 (10-4)와 -4 둘 중에 큰 6이 된다.
  • 세번째 -9로 왔다. 최댓값은 (6-9)와 -9 둘 중에 큰 -3이 된다.
  • 마지막 8이다. 최댓값은 (-3+8)와 8 둘 중에 큰 8이 된다.
  • 이렇게 완성된 최댓값을 저장한 배열은 {10, 6, -3, 8}이고, 정답은 이 중 최댓값인 10이다.

 

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
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
using namespace std;
const int MAX = 100001;
int n;
int arr[MAX];
int dp[MAX];
int answer = -1000 * 100001;
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
 
    dp[0= arr[0];
    for (int i = 1; i < n; i++) {
        dp[i] = max(dp[i - 1+ arr[i], arr[i]);
        
    }
 
    //최댓값 출력
    for (int i = 0; i < n; i++) {
        answer = max(answer, dp[i]);
    }
    cout << answer;
}
cs
728x90

'Algorithm > 동적계획법' 카테고리의 다른 글

[프로그래머스] 정수 삼각형 c++  (0) 2023.02.24
[백준] 11055 가장 큰 증가 부분수열  (0) 2022.02.19
[백준] 2293 동전1 c++  (0) 2022.02.18
[백준] 2156 포도주 시식 c++  (0) 2022.02.16
백준 1149 RGB거리  (0) 2022.02.15

댓글