这是 C 社算法团队的第三次活动。我们研究了一道上海省选的题目,主要运用了状态压缩动态规划算法。其中数学部分比较困难,尚未给出严格证明。
题目
题目来源:洛谷 P3989
给定一个由前个小写字母组成的串。串是阶乘字符串当且仅当前个小写字母的全排列(共种)都作为的子序列(可以不连续)出现。
由这个定义出发,可以得到一个简单的枚举法去验证,但是它实在太慢了。所以现在请你设计一个算法,在 1 秒内判断出给定的串是否是阶乘字符串。
数据规模 | 内存限制 | 运行时间 |
---|---|---|
, | 125MB | 1.0s |
题解
暴力解法自然是枚举全排列并检验,30%的分数到手,不过这个程序没有其它太大意义,甚至由于阶乘级的时间复杂度难以对拍。不多作讨论。
考虑 70%的分数。,可以考虑的算法。既然不能进行全排列的枚举,那么完全可以考虑状态压缩动态规划,枚举一个字母是否出现在状态中。由于要求解的是整个字符串中是否存在前个字母的全排列,则考虑表示对应的几个字母的全排列最早出现在字符串种的何处。状态转移方程举例: