lintcode 移除箱子
描述
给出几个不同颜色的箱子,用不同的正数表示。
你可能会经历几轮拆除箱子,直到没有箱子为止。 每次你可以选择一些具有相同颜色的连续箱子(由k个箱子组成,k >= 1),删除它们并得到k * k分。
找到您可以获得的最高分。
样例
输入:
[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] (33=9分)
----> [1, 3, 3, 3, 1] (11=1分)
----> [1, 1] (33=9分)
----> [] (22=4分)
思路
转载翻译自:
https://leetcode.com/problems/remove-boxes/discuss/101310/Java-top-down-and-bottom-up-DP-solutions
如果使用常规的动态规划用T(i,j)来表示移除i到j之间的箱子能得到的分数,将会出现类似i左边还有箱子无法处理的情况,所以答主使用了T(i,j,k)来表示箱子i到j并且i之前还有k个和i一样的箱子的情况。所以最后的答案应当是T(0,n-1,0)。
对于任意一个情况T(i,j,k),有两种处理方式,
1.移除第i个箱子,分数为(k+1)*(k+1)+T(i+1,j,0)。
2.保留第i个箱子,移除i+1到m-1个箱子,使得i和m个箱子可以一起移除。分数为
T(i+1,m-1,0)+T(m,j,k+1)。因为i到j中可能有多个箱子和第i个箱子相同,所以要在i到j之间进行一次遍历。
代码
上述链接中有java实现代码。