알고리즘
프로그래머스 연속 펄스 부분 수열의 합 c++
fulladdr
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;
}