模拟赛搬了这个题,来写个题解。
\(n\) 这么小,不是状压就是很多很多维 DP(暴论)。状压我没想出来,那就正常 DP。
考虑依次填入字符串的每个位置,记 \(f(i,j,num,op)\) 表示填了前 \(i\) 个位置,其中比 \(s_0\) 小的有 \(j\) 个,目前字典序比 \(s\) 小的子串有 \(num\) 个的方案数,\(op\) 表示是否已经把 \(s\) 填入。那转移分三种:
\[f(i,j,num,op) \rightarrow \begin{cases} f(i+1,j+1,num+j+1,op) \\ f(i+1,j,num+j,op) \\ f(i+len_s,j+cnt,num+j*len_s+tot,1) & op=0 \And i+len_s \le n \end{cases} \]其中 \(cnt\) 表示 \(s\) 内部比 \(s_0\) 小的位置的个数,\(tot\) 表示 \(s\) 内部对 \(num\) 的贡献,这两个量都可以在 \(s\) 串中预处理得到。
应该比较好理解,三种转移分别表示在 \(i+1\) 处填入比 \(s_0\) 小的、比 \(s_0\) 大的、直接填入 \(s\)。
记搜比较好写,我写的记搜。
标签:utpc2012,填入,题解,len,番目,num,DP,op From: https://www.cnblogs.com/tai-chi/p/18521374