[파이썬] 프로그래머스 : 연속 펄스 부분 수열의 합 (레벨3)
풀이
방향성 생각
- 입력보고 $O(N)$으로 비벼야겠다고 생각
- state는 1이 곱해졌는지, -1으로 곱해졌는지 2가지로 나뉘길래 2차원 dp만들고 $O(N)$으로 순회
- dp배열에는 현재 1 혹은 -1이 곱해졌을 때 부분 수열의 합의 최대값을 기록한다
- dp배열에는 최대값을 끝까지 가지고 있지 않다 (다음 위치에는 부분 수열의 합이 작아질수도) -> max(dp[0]), max(dp[1]) 비교
전체코드
def solution(arr):
N = len(arr)
dp = [[0]*N for _ in range(2)]
dp[0][0] = arr[0]
dp[1][0] = -arr[0]
for i in range(N-1):
dp[0][i+1] = max(arr[i+1], dp[1][i] + arr[i+1])
dp[1][i+1] = max(-arr[i+1], dp[0][i] - arr[i+1])
return max(max(dp[i]) for i in range(2))
코멘트
*
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[파이썬] 백준 2515 : 전시장 (골드2) (0) | 2025.04.07 |
---|---|
[파이썬] 백준 17485 : 진우의 달 여행 (Large) (골드5) (0) | 2025.04.07 |
[파이썬] 백준 1890 : 점프 (실버1) (0) | 2025.04.05 |
[파이썬, 자바] 백준 12865 : 평범한 배낭 (골드5) (0) | 2025.02.09 |
[파이썬, 자바] 백준 2240 : 자두나무 (골드5) (0) | 2025.02.09 |
[파이썬] 백준 2011 : 암호코드 (골드5) (0) | 2024.12.31 |
[파이썬] 백준 15486 : 퇴사2 (골드5) (0) | 2024.12.30 |
댓글