ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1912번: 연속합
    다이나믹프로그래밍(DP) 2018. 7. 3. 10:07
    반응형

    https://www.acmicpc.net/problem/1912


    1. 문제

    n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 숫자를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 숫자는 한 개 이상 선택해야 한다.


    예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.


    2. 알고리즘

    키워드 - 다이나믹프로그래밍, 브루트 포스


    * 접근

    초기 문제를 풀때 부르트포스로 해결 했었는데. 7달 뒤 보니 채점 기준이 달라져서 시간 초과 되었다.


    입력 받는 수열 에서

    이전 값과의 합이 더크 다면 현재 dp 에 dp[i - 1] + dp[i] 저장 

    이전 값과의 합이 작다면 현재 입력된 값 저장 : dp[i]


    현재 dp[i] 의 값이 max 보다 크다면 max 값을 갱신 


    3. 코드


    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
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <functional>         // greater 사용 위해 필요  
    #include <string>
     
    using namespace std;
     
    int dp[100001= { 0, };
    int main() {
        ios::sync_with_stdio(false); cin.tie(0);  // scanf 안쓸 경우 쓰세요. Cin 사용시
     
        int N; cin >> N;
     
        int max = -1000000008;
        for (int i = 1; i<= N; i++) {
            cin >> dp[i];
            // 입력을 받으면서 이전 값과의 합이 더크 다면 현재 dp 에 : dp[i - 1] + dp[i] 저장
            // 이전 값과의 합이 작다면 현재 입력된 값 저장 : dp[i]
            dp[i] = dp[i - 1+ dp[i] > dp[i] ? dp[i - 1+ dp[i] : dp[i];
     
            max = dp[i]>max ? dp[i] : max;
        }
     
        
        cout << max;
        return 0;
    }
    cs

    반응형

    '다이나믹프로그래밍(DP)' 카테고리의 다른 글

    백준 1309번: 동물원  (0) 2018.08.04
    백준 11055 번: 가장 큰 증가 부분 수열  (0) 2018.08.02
    백준 10986번: 나머지 합  (0) 2018.07.01
    백준 1904번: 01타일  (0) 2018.06.24
    백준 11726번: 2xn 타일링  (0) 2018.06.23

    댓글

Designed by Tistory.