第一种写法,基本就是暴力版本。会在第140个TC处被卡住。
还是要写第二种。
第一种
class Solution:
def maxPoints(self, points: List[List[int]]) -> int:
dp = [[0 for _ in range(len(points[0]))] for _ in range(len(points))]
for i in range(len(points[0])):
dp[0][i] = points[0][i]
for i in range(1, len(points)):
for j in range(len(points[0])):
for k in range(len(points[0])):
dp[i][j] = max(dp[i][j], points[i][j] + dp[i-1][k] - abs(k - j))
return max(dp[-1][j] for j in range(len(points[0])))
第二种方式,每处理新的一行时,都必须要对上一行的元素进行处理,那么,这里就是可以优化的地方,具体来说,对于正在处理的A[i+1] [j], 可以知道其要么加和上面一个元素A[i][j], 要么从其左边某个位置加和一个元素,或者从j位置右边加和某个元素。则我们只用比较在任意j列位置,其从左侧来的元素-1大,还是j列的元素大。同理对比是从右侧继承的元素-1大,还是j列的元素大,从而更新上一行可以被对列加和到下一行的元素。
class Solution:
def maxPoints(self, points: List[List[int]]) -> int:
for i in range(1, len(points)):
left,right = self.addfromleft(points[i-1]), self.addfromright(points[i-1])
for j in range(len(points[0])):
points[i][j] = max(left[j], right[j]) + points[i][j]
return max(points[-1][:])
def addfromleft(self, arr):
resleft = [arr[0]] + [0 for _ in range(len(arr)-1)]
for i in range(1, len(resleft)):
resleft[i] = max(resleft[i-1]-1, arr[i])
return resleft
def addfromright(self, arr):
resright = [0 for _ in range(len(arr)-1)] + [arr[-1]]
for i in range(len(arr)-2, -1, -1):
resright[i] = max(resright[i+1]-1, arr[i])
return resright