您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页Python | Leetcode Python题解之第546题移除盒子

Python | Leetcode Python题解之第546题移除盒子

来源:叨叨游戏网

题目:

题解:

class Solution:
    def removeBoxes(self, boxes: List[int]) -> int:
        memo = {}
        # 已知boxes[l]有n个的情况下,boxes[l:r]能获得的最大积分
        def dp(l, r, n):
            nonlocal memo, boxes
            if memo.get((l, r, n)):
                return memo[(l, r, n)]
            
            # 只剩最后一个数字,直接结算
            if l == r - 1:
                return (n + 1) * (n + 1)
            
            # 发现邻居和自己相同,和他加一起结算
            if boxes[l] == boxes[l + 1]:
                return dp(l + 1, r, n + 1)
            
            # 先直接结算,之后再看有没有和自己一样的
            res = (n + 1) * (n + 1) + dp(l + 1, r, 0)

            # 已知下一个和自己不一样,从下下个开始找和自己一样的兄弟
            for l2 in range(l + 2, r):
                # 找到兄弟了
                if boxes[l2] == boxes[l]:
                    res = max(
                        res,
                        # 让自己的下一个到这个兄弟之前结算,
                        # 然后让自己和兄弟加起来结算,
                        # 然后取最大值
                        dp(l + 1, l2, 0) + dp(l2, r, n + 1)
                    )
            memo[(l, r, n)] = res
            return res
        # 初始状态为 已知boxes[0]有0个的情况下, boxes[0:]能获得的最大积分
        return dp(0, len(boxes), 0)

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务