DP提高专项1题解

发布时间 2023-10-05 15:34:54作者: Diavolo-Kuang

主要讲一下每一题的做法以及思考方式。

感觉难度薇 \(T1-T3-T2\) 。但是都不算难。

\(T1\)

题目描述

Jimmy 最近迷上了一款叫做方块消除的游戏。游戏规则如下:\(n\) 个带颜色方格排成一列,相同颜色的方块连成一个区域(如果两个相邻方块颜色相同,则这两个方块属于同一区域)。为简化题目,将连起来的同一颜色方块的数目用一个数表示。

例如,9 122233331 表示为

4
1 2 3 1
1 3 4 1

游戏时,你可以任选一个区域消去。设这个区域包含的方块数为 \(x\),则将得到 \(x^2\) 个分值。方块消去之后,其余的方块就会竖直落到底部或其他方块上。而且当有一列方块被完全消去时,其右边的所有方块就会向左移一格。Jimmy 希望你能找出得最高分的最佳方案,你能帮助他吗?

第一行包含一个整数 \(m\)\(1 \le m \le 50\)),表示同颜色方块区域的数目。
第二行包含 \(m\) 个数,表示每个区域的颜色(\(1\)\(m\) 之间的整数)。
第三行包含 \(m\) 个数,表示每个区域包含的方块数(\(1\)\(20\) 之间的整数)。

思路点拨

挺简单的一题。考虑到本题从序列中间开始操作会得到不同的结果,所以不可以使用类似于子序列提取的线性dp,而是考虑区间dp。

我们比较头疼的是,在消除完之后右边的方块会挪过来,所以我们可以在状态中体现这一点。我们定义 \(f_{l,r,k}\) 表示是目前考虑了区间 \(l,r\) 的方格,右端点右边接了 \(k\) 个与之颜色相同过的方块的最大价值。

转移分两类讨论:

  • 把右边炸了!

\[f_{l,r,k}=f_{l,r-1,0}+(num[r]+k)^2 \]

  • 考虑炸掉中间一段,然后右边的 \((num[r]+k)\) 移到左边去(要求左边与右边颜色相同)

\[f_{l,r,k}=f_{l,mid,num[r]+k}+f_{mid+1,r-1,0} \]

别的不需要多多考虑,因为我们最为简单的方式就是从左到右依次炸掉,我们不论怎么操作,答案不会劣于这个。所以我们只需要考虑让颜色相同的尽量在一起炸掉。