알고리즘/프로그래머스
Programers 연속 펄스 부분 수열의 합/ C++
내이름은 킹햄찌
2023. 3. 4. 15:53
https://school.programmers.co.kr/learn/courses/30/lessons/161988
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
아이디어
1로 시작하는 업펄스 수열과 -1로 시작하는 다운펄스 수열이 곱해진 수를 따로 관리하기 위해 2개의 배열을 관리했고, 펄스배열을 곱한수와 이전 수열들의 부분합 + 펄스배열을 곱한 수를 비교하여 최댓값을 찾는 점화식을 이용했다.
Prefix Sum과 DP를 적절하게 이용하여 풀이하려했다.
#include <string>
#include <vector>
using namespace std;
long long solution(vector<int> sequence) {
auto max = [](long long a, long long b)->long long {return a > b ? a : b; };
auto max3 = [](long long a, long long b, long long c)->long long { long long temp = a > b ? a : b; return temp>c?temp:c; };
vector<long long> upPulse(sequence.size(), 0);
vector<long long> downPulse(sequence.size(), 0);
downPulse[0] = -sequence[0];
upPulse[0] = sequence[0];
long long answer = max(downPulse[0],upPulse[0]);
for (long long i = 1; i < sequence.size(); i++) {
if (i & 1) {
downPulse[i] = max(downPulse[i - 1] + sequence[i], sequence[i]);
upPulse[i] = max(upPulse[i - 1] - sequence[i], -sequence[i]);
}
else {
downPulse[i] = max(downPulse[i - 1] - sequence[i], -sequence[i]);
upPulse[i] = max(upPulse[i - 1] + sequence[i], sequence[i]);
}
answer = max3(upPulse[i], downPulse[i], answer);
}
return answer;
}