Leetcode 1937. Maximum Number of Points with Cost [Python]

第一种写法,基本就是暴力版本。会在第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
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值