lintcode 移除箱子

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] (1
1=1分)
----> [1, 1] (33=9分)
----> [] (2
2=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实现代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值