转载标记处: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自动机+矩阵,现在再来看这道题,其实也就是先列出状态转移方程,再构造的优化矩阵。

hdu 3962(AC自动机+矩阵优化dp)相关推荐

  1. 考研路茫茫――单词情结 HDU - 2243(ac自动机 + 矩阵快速幂)

    考研路茫茫--单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. HDU - 2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    题目链接:点击查看 题目大意:给出 n 个词根,现在要求出长度不大于 len 的单词中,有多少单词包含至少一个词根 题目分析:如果我们反过来想,也就是求出来总的单词数,然后减去不包含词根的单词数,剩下 ...

  3. L. Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛,ac自动机+矩阵快速幂 或 BM线性递推)

    描述 God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells hi ...

  4. 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法

    题目描述 输入 注意 是0<=P 输出 样例输入 样例输出 题解 AC自动机+矩阵乘法 先将所有字符串放到AC自动机中,求出Trie图. 然后构建邻接矩阵:如果x不是某个字符串的末位置,则x连向 ...

  5. bzoj 3120 矩阵优化DP

    我的第一道需要程序建矩阵的矩阵优化DP. 题目可以将不同的p分开处理. 对于p==0 || p==1 直接是0或1 对于p>1,就要DP了.这里以p==3为例: 设dp[i][s1][s2][r ...

  6. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  7. hdu 3401 Trade(单调队列优化dp)

    hdu 3401 Trade(单调队列优化dp) 题意:lxhgww喜欢炒股票,他可以在第i天买入或者卖出若干张股票(一天只能买或者卖),两个交易日之间至少相隔w天,问他t天后最多能赚多少. 解题思路 ...

  8. BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...

  9. BZOJ4861 魔法咒语 【AC自动机】【DP】【矩阵快速幂】

    题意: 用n个基本词汇拼出长度为L的字符串,每个基本词汇可以用0次,1次或多次,要求拼出的字符串不能出现m个禁忌词汇中的任何一个,求方案数 mod 1e9+7 60% :1<=N,M<=5 ...

最新文章

  1. 数据结构(02)— 时间复杂度与空间复杂度转换
  2. MD5加密 登录用户名密码
  3. 2020 我的C++学习之路 C++PrimerPlus第十一章课后习题
  4. Netty(一) SpringBoot 整合长连接心跳机制
  5. SQL Server 2000从入门到精通3
  6. 编译原理什么是移进规约冲突_编译原理复习题
  7. Go unsafe Pointer
  8. js防篡改对象之冻结对象
  9. ODP 使用 ArrayBind 时可能会遇到的巨坑 'System.IConvertible' 的解决方法
  10. 安装数据库windows 安装redmine 详解
  11. [Python] np.ones_like(ndarray)和np.zeros_like(ndarray)
  12. guid会不会重复_最笨的方法也许是最快的方法,量变到质变,首先要做的是不断重复...
  13. 除了定时器,真的没法在Simulation Node 类型的CAPL节点中实现延时了吗?
  14. 解决System进程占用80端口的问题
  15. 这样学编程,直接原地起飞啊!
  16. Vite 使用TSX/JSX
  17. Excel VBA 编程的常用代码
  18. 4.1 js小练习题javascript 今日小练习
  19. 半导体2013风云榜 美光大跃进
  20. 情绪激动的时候最好不要做决定

热门文章

  1. 周报速递丨百度与美团等互联互通;京东Shopify达成合作
  2. 神策数据入选铅笔道 2021 真榜“企业服务未来独角兽排行榜·营销与销售 TOP20”...
  3. 他们的背后,是我们!
  4. 乾颐堂安德网工认证1000问(持续更新)
  5. JavaScript 闭包详解
  6. Android四大组件ContentProvider
  7. 《Javascript高级程序设计》读书笔记之bind函数详解
  8. nginx配置反向代理示例
  9. ***脚本***普及
  10. what you CAN LEARN FROM AUTOMATOR AND APPLE STEVE JOBS