关于AC自动机和DP的联系

首先是描述个大概。不说一些特殊的DP 或者借用矩阵来状态转移 (这些本质都是一样的)。

只讲AC自动机和DP的关系(个人理解)。

AC自动机 又可以叫做状态机。

我一开始的认为。AC 自动机提供了一些节点的信息。以及那些节点之间的关系。(节点也就是我们创建的 Trie图的节点。往往我们会有一维这个信息)。

然后我们做DP的时候。就好像是 “顺着” AC自动机指导给我们的方向。然后做状态转移等等。这是一种感性的认识。

 

 

现在我认为。AC自动机本身就是一个大状态。同时父亲和孩子的关系给了我们DP转移时候的方向。当我们创建AC自动机的时候。就是在初始化初始状态。

你可以这样想。一个AC自动机就是一张纸。我们要发生状态转移的时候。就是拿另外一张纸印在上面。并且添加一些东西。那为何有所谓的感性的认识呢?我们之前的感性的认识有没有错呢?答案当然是没有的。因为我们往往设置一开始所有的属性都是INF (无效)。并且令。dp[0][0] = 0(只是举个例子。)。同时碰到dp[i][j] = INF时候。我们不发生转移。导致了好像我们从根节点开始更新慢慢延展出去。好像就是在一个AC自动机上面做延展。(当然不同的人有不同的看法。哪种比较好想就用哪个。)而且两种思想都很重要。一种可以更好理解编码、一种能够更好地提供思路。

 

对于问题:不能出现非法串。

我们的做法是不更新非法点。也不转移非法点。(非法点。就是 root->该点的路径是一个非法串)。

对于问题: 必须出现合法串

我们的做法是增加一维用状态压缩。来确定该串的出现。

同时有一题 是要确定串的构成中一定有指定数量元素的。我们是对元素进行了状压(该题多了个进制转化).

对于问题: 最大积分串

我们的做法就是普通的维护dp[i+1][ch[j][k]] = MAX(dp[i+1][ch[j][k]],dp[i][j]+val[ch[j][k]]).

对于问题:含有主串。

主串修改问题:主串具有指导意义。就比如如果你的

主串删除问题:

原文地址:https://www.cnblogs.com/Milkor/p/4726267.html