题目:
给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色。
你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。
每一轮你可以移除具有相同颜色的连续 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 0
while i<j and boxes[j]==boxes[j-1]:
j-=1
k+=1
ans= (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 ans
return dfs(0,n-1,0)