1937. Maximum Number of Points with Cost - cocoder39/coco39_LC GitHub Wiki

1937. Maximum Number of Points with Cost

approach 1: O(m * n * n) time complexity not acceptable

class Solution:
    def maxPoints(self, points: List[List[int]]) -> int:
        m, n = len(points), len(points[0])
        dp = [[0] * n for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if i == 0:
                    dp[0][j] = points[0][j]
                else:
                    for k in range(n):
                        dp[i][j] = max(dp[i][j], points[i][j] + dp[i-1][k] - abs(j-k))
        
        return max(dp[m-1])

dp[i][j] = max(dp[i][j], points[i][j] + dp[i-1][k] - abs(j-k))

  • dp[i][j] = max(dp[i][j], points[i][j]-j + dp[i-1][k]+k) if 0 <= k <= j
  • dp[i][j] = max(dp[i][j], points[i][j]+j + dp[i-1][k]-k) if j <= k <= n-1

so the problem is converted to find max dp[i-1][k]+k for 0 <= k <= j and max dp[i-1][k]-k for j <= k <= n-1. The max values are then stored in left[j] and right[j]

time complexity O(m * n)

class Solution:
    def maxPoints(self, points: List[List[int]]) -> int:
        m, n = len(points), len(points[0])
        
        dp = [[0] * n for _ in range(m)]
        for i in range(n):
            dp[0][i] = points[0][i]
        
        for i in range(1, m):
            left, right = [0] * n, [0] * n
            
            left[0] = dp[i-1][0]
            for k in range(1, n): # 0 <= k <= j
                left[k] = max(left[k-1], dp[i-1][k] + k)
            
            right[n-1] = dp[i-1][-1] - n + 1
            for k in range(n-2, -1, -1): # j <= k <= n-1
                right[k] = max(right[k+1], dp[i-1][k] - k)
                
            for j in range(n):
                dp[i][j] = max(left[j] - j, right[j] + j) + points[i][j]
        
        return max(dp[m-1])