Module: 动态规划中的模式 - 2


Problem

1 /5


填充游戏

Theory Click to read/hide

免责声明:下面描述的方法并不通用,但它通常可以解决问题或帮助您找到正确的解决方案。

如果一个问题要求您以最佳方式销毁/折叠/合并(或类似)一个数组,那么您应该尝试使用子段上的动态规划来解决它。

让我们得到 dp[l][r] - 索引从 l 到 r 的子段的最佳答案。动力学的重新计算高度依赖于任务,但有以下一般思路:

1) 查看极端元素 l 和 r。如果它们以某种其他方式匹配或互补,那么很可能可以通过 dp[l+1][r-1] 更新 dp[l][r] 的值。否则通过 dp[l][r-1] 或 dp[l+1[r]。

2) 段 [l;r] 不能通过单一结构表示的情况经常发生。那么需要考虑把这个subsegment所有可能的section分成两部分,即从l到r-1遍历元素k,通过dp[l][k]和dp[重新计算dp[l][r] k+1][r]。在更小的子段中,这些部分也被整理出来,因此,实际上,将子段 [l;r] 不仅分为两个部分,而且分成任意数量的部分的选项都被考虑在内。
 

Problem

给你一条方格纸,由 n 个彩色方块组成,从左到右编号为 1 到 n。第 i 个方块的初始颜色为 ci

如果 c= cj 和 c= ck,我们说方块 i 和 j 位于同一分量 对于所有 k 满足 i <; k < j.换句话说,从 i 到 j 的线段上的所有方块必须具有相同的颜色。
例如,条带 [3,3,3] 有 1 个连通分量,而 [5,2,4,4] 有 3 个。

填充游戏在此条上播放如下:
游戏开始时,您随机选择一个起始方块(这不算一回合)。
然后,在每次移动中,将包含起始方块的连接组件的颜色更改为任何其他颜色。

找出将整个条带重新着色为一种颜色所需的最少移动次数。

输入:
第一行包含一个整数 n (1 ≤ n ≤ 5000) —正方形的数量。

第二行包含整数 c1,c2,…,cn (1 ≤ ci <5000) ——方块的初始颜色。

输出:
打印单个整数——最小移动次数。

示例:
  <正文>
解释:
第一个例子中的最佳方式之一:[5, 2, 2, 1] -> [5, 2, 2, 2] -> [5, 5, 5, 5]
输入 输出
4
5 2 2 1
2
8
4 5 2 2 1 3 5 5
4
1
4
0