문제 설명
어떤 수열의 연속 부분 수열에 같은 길이의 펄스 수열을 각 원소끼리 곱하여 연속 펄스 부분 수열을 만들려 합니다. 펄스 수열이란 [1, -1, 1, -1 …] 또는 [-1, 1, -1, 1 …] 과 같이 1 또는 -1로 시작하면서 1과 -1이 번갈아 나오는 수열입니다.
예를 들어 수열 [2, 3, -6, 1, 3, -1, 2, 4]의 연속 부분 수열 [3, -6, 1]에 펄스 수열 [1, -1, 1]을 곱하면 연속 펄스 부분수열은 [3, 6, 1]이 됩니다. 또 다른 예시로 연속 부분 수열 [3, -1, 2, 4]에 펄스 수열 [-1, 1, -1, 1]을 곱하면 연속 펄스 부분수열은 [-3, -1, -2, 4]이 됩니다.
정수 수열 sequence가 매개변수로 주어질 때, 연속 펄스 부분 수열의 합 중 가장 큰 것을 return 하도록 solution 함수를 완성해주세요.
문제의 핵심이 되는 점화식을 구성할줄 알아야한다.
먼저 1과 -1이 번갈아 나올수 있으므로 첫번째가 1인경우와 -1인경우 두가지 모두를 구해야한다.
또한 부분 수열중 가장큰것을 찾아보면 다음과 같다.
먼저 부분수열이 이어져야하고, 그 다음 값이 들어왔을때 그 값과 그값을 더한 합을 비교했을때 큰 값을 저장하면 된다.
즉 dp[i] = max(현재 비교값,현재비교값+누적값)이다.
코드
class Solution {
public long solution(int[] sequence) {
long answer = 0;
long[] dp1 = new long[sequence.length];
long[] dp2 = new long[sequence.length];
dp1[0]=sequence[0]*-1;
dp2[0]=sequence[0];
answer =Math.max(dp1[0],dp2[0]);
for(int i=1;i<sequence.length;i++){
if(i%2==0){
dp1[i]= Math.max(sequence[i]*-1,dp1[i-1]+sequence[i]*-1);
dp2[i]= Math.max(sequence[i],dp2[i-1]+sequence[i]);
}else{
dp1[i]= Math.max(sequence[i],dp1[i-1]+sequence[i]);
dp2[i]= Math.max(sequence[i]*-1,dp2[i-1]+sequence[i]*-1);
}
answer =Math.max(answer,Math.max(dp1[i],dp2[i]));
}
return answer;
}
}//dp 문제