[Programmers] Q161998 연속 펄스 부분 수열의 합

Question

Language: Python

Difficulty: Level 3

해당 문제는 연속된 펄스 부분의 합 중에서 가질 수 있는 최대값을 구하는 문제로, Dynamic Programming을 활용하여 문제 풀이가 가능하다.

-1부터 시작하는 경우와 1부터 시작하는 경우를 분리해서 아래와 같이 연산을 통해 최대값을 갱신할 수 있다. 기존에 누적해오던 펄스 부분의 합에 현재 값을 더한 것과 현재값만을 취할 때를 비교해서 현재 index에서 가질 수 있는 최대 부분 합을 저장하는 방식으로 진행한다.

for i in range(length):
    for j in range(2):
        dp[i][j]=max(dp[i-1][j] + sequence[i]*((-1)**(i+j)),sequence[i]*((-1)**(i+j))) 
    max_value=max(max_value,max(dp[i]))

[2, 3, -6, 1, 3, -1, 2, 4]의 경우에 대해서 위의 연산을 수행해보면 아래와 같은 결과가 도출되고, 최대값은 10이 된다.

  0 1 2 3 4 5 6 7
0 2 -1 -6 -1 3 4 6 2
1 -2 3 9 10 7 6 4 8

Solution

from math import inf
def solution(sequence):
    answer = 0
    length=len(sequence)
    
    dp=[[-inf,-inf] for _ in range(length)]
    
    dp[0]=[1*sequence[0],-1*sequence[0]]
    max_value=max(dp[0])
    
    for i in range(1,length):
        for j in range(2):
            dp[i][j]=max(dp[i-1][j] + sequence[i]*((-1)**(i+j)),sequence[i]*((-1)**(i+j)))
        
        max_value=max(max_value,max(dp[i]))
    
    answer=max_value     
    return answer

댓글남기기