LeetCode/DP심화

2140. Solving Questions With Brainpower

hyunkookim 2025. 1. 12. 19:58

2140. Solving Questions With Brainpower

 

class Solution:
    def mostPoints(self, questions: List[List[int]]) -> int:
        # brainpower[i]는 해당 문제를 푼 후 건너뛰어야 하는 문제의 개수를 의미
        # 즉, 문제 i를 풀기로 선택하면, 
        # 그 다음 연속된 brainpower[i]개의 문제는 풀 수 없음
        n = len(questions)

        dp = [0] * (n+1)  # dp[i]는 질문 i부터 끝까지 얻을 수 있는 최대 점수

        for i in range(n - 1, -1, -1):  # 역순으로 순회
            point, brainpower = questions[i]
            
            # 현재 질문을 풀이한 경우와 건너뛴 경우 중 더 큰 값을 저장
            if i + brainpower + 1 < n:
                dp[i] = max(dp[i + 1], point + dp[i + brainpower + 1])
            else:
                dp[i] = max(dp[i + 1], point)

        return dp[0]  # 첫 번째 질문부터 얻을 수 있는 최대 점수 반환

 

최적화 (공간 복잡도 O(1)로 줄이기)

dp 배열 대신 두 개의 변수를 사용하여 공간을 절약할 수 있습니다:

class Solution:
    def mostPoints(self, questions: List[List[int]]) -> int:
        n = len(questions)
        next_dp, curr_dp = 0, 0  # 다음 상태와 현재 상태를 저장

        for i in range(n - 1, -1, -1):  # 역순으로 순회
            point, brainpower = questions[i]
            if i + brainpower + 1 < n:
                curr_dp = max(next_dp, point + dp[i + brainpower + 1])
            else:
                curr_dp = max(next_dp, point)
            next_dp = curr_dp  # 다음 상태 업데이트

        return curr_dp

 

https://youtu.be/D7TD_ArkfkA?si=Ij633n4xB8ZT6h_Q

 

class Solution:
    def mostPoints(self, questions: List[List[int]]) -> int:
        # brainpower[i]는 해당 문제를 푼 후 건너뛰어야 하는 문제의 개수를 의미
        # 즉, 문제 i를 풀기로 선택하면, 
        # 그 다음 연속된 brainpower[i]개의 문제는 풀 수 없음
        dp = {}

        def dfs(i):
            if i >= len(questions):
                return 0

            if i in dp:
                return dp[i]

            dp[i] = max(
                dfs(i+1), # skip question
                questions[i][0] + dfs(i + 1 + questions[i][1]) # solve current question
            )
            return dp[i] 

        return dfs(0)

 

최적화

 

class Solution:
    def mostPoints(self, questions: List[List[int]]) -> int:
        # brainpower[i]는 해당 문제를 푼 후 건너뛰어야 하는 문제의 개수를 의미
        # 즉, 문제 i를 풀기로 선택하면, 
        # 그 다음 연속된 brainpower[i]개의 문제는 풀 수 없음

        # Time: O(N)
        # Space: O(N)
        dp = {}

        for i in range(len(questions)-1, -1, -1): # reversed order
            dp[i] = max(questions[i][0] + dp.get(i + 1 + questions[i][1], 0), # include 
                        dp.get(i+1, 0)) # skip
        return dp[0]

'LeetCode > DP심화' 카테고리의 다른 글

91. Decode Ways  (0) 2025.01.13
2466. Count Ways To Build Good Strings  (0) 2025.01.13
474. Ones and Zeroes  (1) 2025.01.12
377. Combination Sum IV  (0) 2025.01.12
279. Perfect Squares ★★★  (2) 2025.01.08