Stamp
作者 : 周子鑫
关键词 : 动态规划
题目简述
给定一个长度为的串, 包含 4种字符的串,你需要把一个长度为的空白纸带给染成。
中的符号可以匹配任意一种颜色。
染色定义为两个操作:
- 选择一个长度,一旦确定就不能更改。
- 在 三种颜色中选择一种,并在纸带上选择一段长度为的空白区间,将这个区间颜色染成选定的颜色。这个操作可以进行若干次,直到纸带上每个位置都被上色。
假设进行了次给长度为的空白区间染色,染色的花费定义为。
求把空白纸带染成的最小花费。
分析
这题似乎也没什么性质(?)那么就先来考虑确定的情况。
需要最小化, 那么就是要最小化。
如果两两染色之间都没有覆盖,那么直接扫一遍判断是否合法就行了。问题是两染色之间可能会相互覆盖,这时候发现如果两次染色有覆盖,那么这两次染色所选的颜色肯定是相同的。
那么在纸带上,一段相同颜色区间的长度就至少为.
诶..既然已经知道这个东西了,看起来就可以做了。
算法
首先当然是枚举这个长度,然后考虑怎么去做算固定长度的情况。
下面介绍两种的思路
动态规划1
令表示前个位置都与匹配的最小染色数。 枚举这一段颜色的长度, 其中 ,
这个还是非常好理解的,每一段长度为的区间需要至少次染色才能完成。
这种方法的时间复杂度是
动态规划2
令表示前个位置都合法且最后一次染了的方案数, 和同理。枚举上一次染色的区间,上一次染色的区间有两种可能:
- 上一个区间不和相交,这种情况就直接转移就可以了。
- 上一个区间和相交于,我们已经知道,两个区间如果相交那么它们的颜色一定相同,以为例 。
第二部分转移如果直接枚举所有的,的复杂度就是, 如果用单调队列去维护的话复杂度就是。
两种方法的空间复杂度都是。
将上述结合枚举,总的时间复杂度就是或。