题目:
给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色。你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >= 1),这样一轮之后你将得到 k*k 个积分。当你将所有盒子都去掉之后,求你能获得的最大积分和。示例:输入:boxes = [1,3,2,2,2,3,4,3,1]输出:23解释:[1, 3, 2, 2, 2, 3, 4, 3, 1]----> [1, 3, 3, 4, 3, 1] (3*3=9 分)----> [1, 3, 3, 3, 1] (1*1=1 分)----> [1, 1] (3*3=9 分)----> [] (2*2=4 分)来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-boxes著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
答案:
时间:
区间dp怎么越做越难,当然做不出了。
class Solution:def removeBoxes(self, boxes: List[int]) -> int:n = len(boxes)@functools.lru_cache(None)def dfs(i,j,k):if i>j:return 0while i<j and boxes[j]==boxes[j-1]:j-=1k+=1ans= (k+1)*(k+1) +dfs(i,j-1,0)for p in range(i,j):if boxes[p]==boxes[j]:ans =max(ans,dfs(i,p,k+1)+dfs(p+1,j-1,0))return ansreturn dfs(0,n-1,0)
