UVA 10559 Blocks 方块消除

在这里插入图片描述
【分析】
为了叙述方便,设左数第i个方块的颜色为A[i]。按照线性结构动态规划的常见思路,设d(i,j)表示子序列i~j的最大得分,但是似乎无法用d(i,k)和d(k,j)来计算d(i,j),因为可能i~k和k~j各剩下一些,拼起来以后消除。如XAXBXCXDXEX,实际上是把A和E全部单个消除以后再消除X的。怎么办呢?

在最优矩阵链乘中,枚举的是“最后一次乘法”的位置。本题是不是也可以枚举“最后一个方块什么时候消掉”呢?这个问题的答案有两种可能:直接把它所在的一段消掉;把它和左边的某段拼起来以后一起消。第一种情况容易处理,但第二种情况就没那么简单了。
具体来说,设与j同色的方块可以向左延伸到p(即A[p]=A[p+1]=…=A[j]),
且A[q]=A[j],A[q]不等于A[q+1],则上述第二种情况就是指先把q+1~p-1这一段消掉,把p~j这一段和以q为右端点的那一段拼起来,如图9-23所示。注意i~j全部同色时找不到这样的q,但此时可以直接计算出结果。下面忽略这种情况。
在这里插入图片描述
不过,把这两段拼起来以后仍然不一定立刻消除,还可能要和更左边的另一段拼起来……是不是很复杂?但有一点是可以肯定的,那就是q+1~p-1这一段肯定可以先消掉(拖到后面再消也得不到什么好处)。那么现在就把它消掉(得分是d(q+1,p-1)),得到一个“子序列i~q的右边再拼上j-p+1个与A[q]同色的方块”的奇怪状态,如图9-24所示。
在这里插入图片描述
由此可知,在状态中增加一维,来表达“右边拼上一些方块”,即用d(i,j,k)表示“原序列中的方块i~j右边再拼上k个颜色等于A[j]的方块所得到的新序列”的最大得分,则决策有两种。
决策1:直接消去方块j,转移到d(i,p-1,0)+(j-p+k+1)²。

i ~ j 被分成 i ~ p-1 和 p ~ j 两段,其中p ~ j 和右侧k个方块颜色相同,数目为 j-p+1+k ,直接消去得分为(j-p+k+1)²

决策2:枚举q<p使得A[q]=A[j]且A[q]不等于A[q+1],转移到d(q+1,p-1,0)+d(i,q, j-p+k+1)。

i ~ j 被分成 i ~ q 、q+1 ~ p-1 和 p ~ j 三段,其中 i ~ q , p ~ j 和右侧k个方块颜色相同,需要转移到d(i,q, j-p+k+1) , q+1 ~ p-1 段颜色相同 ,转移到d(q+1,p-1,0)

状态有O(n³)个,决策有O(n)个,时间复杂度为O(n^4)。如果采用记忆化搜索,很多状态都达不到,而且q的取值范围往往很小,所以对于大部分数据,这个算法的的运行效率都很高。

Blocks UVA - 10559

k表示的就是已经消除后的(或着未发生过消除,结果一样),所有颜色与原序列最右侧方块相同的,一段方块序列(其中方块个数为k,位于原序列右侧),注意这里的k个方块在上图中未画出。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值