听起来很高级。
考虑普通的dp
常常是
f
i
f_{i}
fi从
f
i
−
1
f_{i-1}
fi−1通过转移T来的这样的形式。
下标之间的转移很方便。
有时
f
i
f_{i}
fi的这个
i
i
i想知道从哪里转移过来不像上面那么容易。
需要把
i
i
i视作另一个dp中某个状态的值。而它在另一个dp中又一个值为j的状态通过T转移而来。
此时就在外层dp中让
f
i
f_{i}
fi从
f
j
f_{j}
fj转移过来。
而内层循环常常不是临时计算,而是提前计算好对于任意一个i,面对转移T会转移到谁。那么可以提前构造好一个自动机。
外层dp此时可以理解为是在这个自动机上面dp。
其实这里的 f i f_i fi的i并不一定是一个值,它可以是很多状态的答案状压后的值。
这有什么用呢。
通常的考法是一般就是为满足某种状态的东西dp计数。
这里的“某种状态”其实就是上面的i。
最常见的其实是关于lcs。
例如TJOI2018 游园会。
这里定义的是
f
i
,
s
t
f_{i,st}
fi,st表示能与这个串的每一位的lcs长度的状态是st的长度为i的合法字符串数量。
更复杂的,参考ZJOI2019 麻将。