프로그래머스 연속 펄스 부분 수열의 합 c++

2023. 10. 26. 14:16알고리즘

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

long long plusDp[500001];
long long minusDp[500001];

long long solution(vector<int> sequence) {
    long long answer = 0;
    
    vector<long long> plusSequence, minusSequence;
    
    // 펄스 수열 두가지를 곱해서 두개의 수열을 만들었다
    for (int i=0;i<sequence.size();i++){
        if (i%2){
            plusSequence.push_back(sequence[i]*(-1));    
            minusSequence.push_back(sequence[i]);
        }
        else {
            plusSequence.push_back(sequence[i]);    
            minusSequence.push_back(sequence[i]*(-1));
        }
    }
    
    // dp[i] = i번째까지 최대 펄스 수열
    plusDp[0] = plusSequence[0], minusDp[0] = minusSequence[0];
    for (int i=1;i<plusSequence.size();i++){
        plusDp[i] = max(plusSequence[i], plusDp[i-1]+plusSequence[i]);
    }
    for (int i=1;i<minusSequence.size();i++){
        minusDp[i] = max(minusSequence[i], minusDp[i-1]+minusSequence[i]);
    }
    for (int i=0;i<minusSequence.size();i++){
        answer = max(answer, plusDp[i]);
    }
    for (int i=0;i<minusSequence.size();i++){
        answer = max(answer, minusDp[i]);
    }
    return answer;
}