hdu 3962(AC自动机+矩阵优化dp)
2016-03-07 19:27
393 查看
转载标记处:http://blog.csdn.net/woshi250hua/article/details/7599472
题目大意:给定m个DNA病毒序列,求碱基构成的长度为n且含有两个以上DNA病毒序列,结果对10007取模。
解题思路:本题代码量大,较为综合,需用到AC自动机改造而成的Trie图、DP思想、矩阵快速幂。
如果n比较小,那么本题可以用DP解,由于题目明显的有三个状态,未含病毒串、含一个病毒串,含两个及两个以上病毒,根据这三个就可以写出一个状态转移方程。但是本题可以简化一下,先求出总的组合种数,再减去含有一个病毒串和未含病毒串的种数就是解了。那么状态就只有2个。
状态转移方程为:if (j->next 为病毒串) dp[i+1][j->next][1] += dp[i][j][0] ;
else if (j->next非病毒串) dp[i+1][j->next][1] += dp[i][j][1];
dp[i+1][j->next][0] += dp[i][j][0];
但是本题n特别大,必须用矩阵进行优化。先将Trie图转化为一个(total * 2) * (total * 2)(total为总节点数)可达矩阵,如果i < total,那说明这个节点和他的后缀不含有病毒串,如果i > total,那说明这个节点和他的后缀含有1个病毒串。
具体实现是这样的,if (i->next->flag) matrix[i][i->next+total]++;
else matrix[i][i->next]++,matrix[i+total][i->next+total]++;
这样,矩阵就被分成四块相当于四个象限,第2个象限(i和j都小于total)怎么走都不会出现病毒串,那么经过A^n,他们的值就是最后病毒序列为0个的种数。第1个象限表示i走到j-total会出现一个病毒DNA序列,第四个象限i-total走到j-total,原来含1个病毒串现在还是1个。
这里的矩阵优化dp确实做得很巧妙,实际上矩阵优化dp只能够处理一维和二维的状态,在二维的情况下,dp[i][]只能够与dp[i-1][]有关。如果大于二维,比如本题的情况,就想办法分解成二维的,以本题为例,第三维的状态只有0和1两种可能,我们实际上是把第二维扩大了1倍,得到的是一个(2*tot)*(2*tot)的状态矩阵,这样就可以表示出第三维的状态了。剩下的就是按照原来的状态转移方程来填矩阵的系数了。
这道题让我想起了上一道DNA Sequence,也是AC自动机+矩阵,现在再来看这道题,其实也就是先列出状态转移方程,再构造的优化矩阵。
题目大意:给定m个DNA病毒序列,求碱基构成的长度为n且含有两个以上DNA病毒序列,结果对10007取模。
解题思路:本题代码量大,较为综合,需用到AC自动机改造而成的Trie图、DP思想、矩阵快速幂。
如果n比较小,那么本题可以用DP解,由于题目明显的有三个状态,未含病毒串、含一个病毒串,含两个及两个以上病毒,根据这三个就可以写出一个状态转移方程。但是本题可以简化一下,先求出总的组合种数,再减去含有一个病毒串和未含病毒串的种数就是解了。那么状态就只有2个。
状态转移方程为:if (j->next 为病毒串) dp[i+1][j->next][1] += dp[i][j][0] ;
else if (j->next非病毒串) dp[i+1][j->next][1] += dp[i][j][1];
dp[i+1][j->next][0] += dp[i][j][0];
但是本题n特别大,必须用矩阵进行优化。先将Trie图转化为一个(total * 2) * (total * 2)(total为总节点数)可达矩阵,如果i < total,那说明这个节点和他的后缀不含有病毒串,如果i > total,那说明这个节点和他的后缀含有1个病毒串。
具体实现是这样的,if (i->next->flag) matrix[i][i->next+total]++;
else matrix[i][i->next]++,matrix[i+total][i->next+total]++;
这样,矩阵就被分成四块相当于四个象限,第2个象限(i和j都小于total)怎么走都不会出现病毒串,那么经过A^n,他们的值就是最后病毒序列为0个的种数。第1个象限表示i走到j-total会出现一个病毒DNA序列,第四个象限i-total走到j-total,原来含1个病毒串现在还是1个。
这里的矩阵优化dp确实做得很巧妙,实际上矩阵优化dp只能够处理一维和二维的状态,在二维的情况下,dp[i][]只能够与dp[i-1][]有关。如果大于二维,比如本题的情况,就想办法分解成二维的,以本题为例,第三维的状态只有0和1两种可能,我们实际上是把第二维扩大了1倍,得到的是一个(2*tot)*(2*tot)的状态矩阵,这样就可以表示出第三维的状态了。剩下的就是按照原来的状态转移方程来填矩阵的系数了。
这道题让我想起了上一道DNA Sequence,也是AC自动机+矩阵,现在再来看这道题,其实也就是先列出状态转移方程,再构造的优化矩阵。
相关文章推荐
- HDU4758 AC自动机+DP (HDU4758与HDU2222)
- AC自动机-一般算法实现
- 字符串的多模式匹配
- BZOJ1030 [JSOI2007]文本生成器【AC自动机+DP】
- BZOJ2434 [Noi2011]阿狸的打字机【AC自动机+dfs序+树状数组】
- AC自动机
- HDU_2222 大部分是别人的,有的地方稍有改动,代码有不完善的地方!
- AC自动机算法
- HDU-2222 Keyword Search
- 【AC自动机】hdu2222 hdu2896 hdu3065 zoj3430 poj2778 hdu2243
- 【AC自动机】hdu2222 hdu2896 hdu3065 zoj3430 poj2778
- 两天AC自动机的学习 HDOJ2222 HDOJ 2896
- ac自动机+矩阵
- hdu2222 ac自动机。。。。
- poj3691DNA repair
- hdu2222Keywords Search
- hdu 3065 病毒侵袭持续中
- poj 2778 AC自动机+dp矩阵快速幂
- 2015湖南省队集训DAY6——B题(BZOJ4179)
- AC自动机入门