Stamp

作者 : 周子鑫

关键词 : 动态规划

题目简述

给定一个长度为的串, 包含 4种字符的串,你需要把一个长度为的空白纸带给染成

中的符号可以匹配任意一种颜色。

染色定义为两个操作:

  • 选择一个长度一旦确定就不能更改。
  • 三种颜色中选择一种,并在纸带上选择一段长度为空白区间,将这个区间颜色染成选定的颜色。这个操作可以进行若干次,直到纸带上每个位置都被上色。

假设进行了次给长度为的空白区间染色,染色的花费定义为

求把空白纸带染成的最小花费。

分析

这题似乎也没什么性质(?)那么就先来考虑确定的情况。

需要最小化, 那么就是要最小化

如果两两染色之间都没有覆盖,那么直接扫一遍判断是否合法就行了。问题是两染色之间可能会相互覆盖,这时候发现如果两次染色有覆盖,那么这两次染色所选的颜色肯定是相同的。

那么在纸带上,一段相同颜色区间的长度就至少为.

诶..既然已经知道这个东西了,看起来就可以做了。

算法

首先当然是枚举这个长度,然后考虑怎么去做算固定长度的情况。

下面介绍两种的思路

动态规划1

表示前个位置都与匹配的最小染色数。 枚举这一段颜色的长度, 其中 ,

这个还是非常好理解的,每一段长度为的区间需要至少次染色才能完成。

这种方法的时间复杂度是

动态规划2

表示前个位置都合法且最后一次染了的方案数, 同理。枚举上一次染色的区间,上一次染色的区间有两种可能:

  • 上一个区间不和相交,这种情况就直接转移就可以了。
  • 上一个区间和相交于,我们已经知道,两个区间如果相交那么它们的颜色一定相同,以为例

第二部分转移如果直接枚举所有的的复杂度就是, 如果用单调队列去维护的话复杂度就是

两种方法的空间复杂度都是

将上述结合枚举,总的时间复杂度就是

results matching ""

    No results matching ""