据说是 Google Code Jam 2008 的题,好像还可以转化为求 Hamilton 路径?
我太弱了太弱了,不懂。
排列?k≤16?状压!
显然主体的转移复杂度不能和字符串长度相关,而是用预处理代替。
设这个长度为 m,并设 n=k(不要问为什么,个人爱好)。
设 fS,i,j 表示目前拼成的排列用到的数构成集合 S,这个排列的首项为 i,末项为 j。
设 vi,j 表示所有 mn 段中有多少段第 i 个字符和第 j 个字符不相等。
设 wi,j 表示所有 mn−1 段中有多少段第 i 个字符和下一段的第 j 个字符相等。
显然有转移 fS⋃{k},i,k=minj∈S(fS,i,j+vi,j)(k∉S)。
统计答案时,求 mini,j∈full,i≠j(ffull,i,j−wj,i)(full=n⋃i=1{i})。
注意这样子空间复杂度是 O(2nn2) 的,而题目卡了空间 TAT……
注意到 i 这一维在转移的时候是不变的,所以可以压掉这一维,并把 i 放在最外层枚举。
总复杂度 O(mn+2nn3)。
代码:
1 |
|