Leetcode 3257. Maximum Value Sum by Placing Three Rooks II

1. 解题思路

这道题同样是题目3256的一个进阶版本,但同样也只是增加了复杂度而已,整体而言两者的解题思路是完全相同的,就是一个遍历+剪枝的思路。

首先,我们将所有元素按照其值的大小从大到小进行排列,然后依次考察每个元素被选入的情况,这个就是一个简单的迭代算法,倒是也没啥复杂的。

但是显然,如果不加上任何额外操作,整体的算法复杂度就会是 O ( n 3 m 3 ) O(n^3m^3) O(n3m3),这显然是不可接受的,因此我们需要进行剪枝,而剪枝逻辑倒也简单,我们优先从大到小进行选取,如果后续连续元素加上之前已选的元素的和已经无法超过当前选到的最大值了,那么后续所有的遍历都没必要再进行了,此时我们就能大幅缩减整体的算法复杂度,使之通过这两道题的全部测试样例。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maximumValueSum(self, board: List[List[int]]) -> int:
        n, m = len(board), len(board[0])
        ans = -math.inf
        cells = [(board[i][j], i, j) for i in range(n) for j in range(m)]
        cells = sorted(cells, reverse=True)
        N = n * m
        
        def dfs(idx, selected, pre):
            nonlocal ans
            if len(selected) == 3:
                ans = max(ans, pre)
            if idx >= N:
                return
            if pre + sum(x[0] for x in cells[idx: idx+3-len(selected)]) <= ans:
                return
            if selected == [] or all(cells[idx][1] != x and cells[idx][2] != y for x, y in selected):
                dfs(idx+1, selected + [(cells[idx][1], cells[idx][2])], pre + cells[idx][0])
            dfs(idx+1, selected, pre)
            return
        
        dfs(0, [], 0)
        return ans

提交代码评测得到:耗时1205ms,占用内存117.7MB。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值