https://blog.sengxian.com/solutions/bzoj-1444 orz

一直是我想错了,建出AC自动机之后,实际上这个定义是设f[i]为经过i节点的 * 期望次数 * ,因为单词末尾节点走到意味着游戏结束,所以经过单词末尾节点的概率就是经过单词末尾节点的期望次数。为什么是期望呢,因为概率的上限是1,不能随便转移

这样定义状态之后,得到dp转移为

\[f[i]=\sum_{pr节点可以通过字符c转移到i节点}p[c]*f[pr]
\]

因为是期望,所以root节点右边要加1

然后移项做高斯消元即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<queue>
  5. #include<cstring>
  6. using namespace std;
  7. const int N=105;
  8. int n,l,m,c[N][15],tot=1,fa[N],va[N],fl,id[N];
  9. double p[N],a[N][N],d[N];
  10. char s[N];
  11. void gaosi(int n)
  12. {
  13. for(int i=1;i<=n;i++)
  14. {
  15. int nw=i;
  16. for(int j=i+1;j<=n;j++)
  17. if(fabs(a[nw][i])<fabs(a[j][i]))
  18. nw=j;
  19. for(int j=i;j<=n+1;j++)
  20. swap(a[nw][j],a[i][j]);
  21. for(int j=i+1;j<=n+1;j++)
  22. a[i][j]/=a[i][i];
  23. a[i][i]=1;
  24. for(int j=i+1;j<=n;j++)
  25. {
  26. for(int k=i+1;k<=n+1;k++)
  27. a[j][k]-=a[j][i]*a[i][k];
  28. a[j][i]=0;
  29. }
  30. }
  31. for(int i=n-1;i>=1;i--)
  32. for(int j=i+1;j<=n;j++)
  33. a[i][n+1]-=a[j][n+1]*a[i][j];
  34. }
  35. int main()
  36. {
  37. scanf("%d%d%d",&n,&l,&m);
  38. for(int i=0,x,y;i<m;i++)
  39. {
  40. scanf("%d%d",&x,&y);
  41. p[i]=(double)x/(double)y;
  42. }
  43. for(int ca=1;ca<=n;ca++)
  44. {
  45. scanf("%s",s+1);
  46. int nw=1,f=0;
  47. for(int i=1;i<=strlen(s+1);i++)
  48. {
  49. if(p[s[i]-'A']<1e-8)
  50. f=1;
  51. if(!c[nw][s[i]-'A'])
  52. c[nw][s[i]-'A']=++tot;
  53. nw=c[nw][s[i]-'A'];
  54. }
  55. va[nw]=1;
  56. id[ca]=tot;//cerr<<id[ca]<<endl;
  57. fl+=f;
  58. }
  59. if(fl==n)
  60. {
  61. for(int i=1;i<=n;i++)
  62. puts("0.00");
  63. return 0;
  64. }
  65. queue<int>q;
  66. for(int i=0;i<m;i++)
  67. if(c[1][i])
  68. fa[c[1][i]]=1,q.push(c[1][i]);
  69. else
  70. c[1][i]=1;
  71. while(!q.empty())
  72. {
  73. int u=q.front();
  74. q.pop();
  75. for(int i=0;i<m;i++)
  76. if(c[u][i])
  77. fa[c[u][i]]=c[fa[u]][i],q.push(c[u][i]);
  78. else
  79. c[u][i]=c[fa[u]][i];
  80. }
  81. a[1][1]=-1,a[1][tot+1]=-1;
  82. for(int i=1;i<=tot;i++)
  83. {
  84. if(i>1)
  85. a[i][i]--;
  86. if(va[i])
  87. continue;
  88. for(int j=0;j<m;j++)
  89. a[c[i][j]][i]+=p[j];
  90. }//cerr<<tot<<endl;
  91. gaosi(tot);
  92. // for(int i=1;i<=tot;i++)
  93. // {
  94. // for(int j=1;j<=tot+1;j++)
  95. // cerr<<a[i][j]<<" ";
  96. // cerr<<endl;
  97. // }
  98. for(int i=1;i<=n;i++)
  99. printf("%.2f\n",a[id[i]][tot+1]/a[id[i]][id[i]]);
  100. return 0;
  101. }

bzoj 1444: [Jsoi2009]有趣的游戏【AC自动机+dp+高斯消元】的更多相关文章

  1. BZOJ 1444 [Jsoi2009]有趣的游戏 (AC自动机 + 概率DP + Gauss)

    1444: [Jsoi2009]有趣的游戏 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1382  Solved: 498[Submit][Statu ...

  2. BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]

    1444: [Jsoi2009]有趣的游戏 题意:每种字母出现概率\(p_i\),有一些长度len的字符串,求他们出现的概率 套路DP的话,\(f[i][j]\) i个字符走到节点j的概率,建出转移矩 ...

  3. BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)

    诶这题洛谷居然没有??? 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1444 题解: 我见到主要有三种做法. 一是矩阵乘法.设\(d ...

  4. BZOJ 1444: [Jsoi2009]有趣的游戏 AC自动机+概率与期望+矩阵乘法

    这道题还比较友好~首先,构建出来 $AC$ 自动机,那么我们要求的就是从 $0$ 号点走无限次走到一个终止节点的概率. 考虑构建转移矩阵 $M,$ $M_{i,j}$ 表示节点 $i$ 转移到节点 $ ...

  5. BZOJ 1444:[JSOI2009]有趣的游戏

    BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...

  6. BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)

    1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...

  7. 【BZOJ1444】[Jsoi2009]有趣的游戏 AC自动机+概率DP+矩阵乘法

    [BZOJ1444][Jsoi2009]有趣的游戏 Description Input 注意 是0<=P Output Sample Input Sample Output HINT  30%的 ...

  8. ●BZOJ 1444 [Jsoi2009]有趣的游戏

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1444题解.1: 概率dp,矩阵乘法,快速幂. 对所有串建立AC自动机, 那么如果在trie树 ...

  9. bzoj1444[Jsoi2009]有趣的游戏[AC自动机]

    题面 bzoj 我要向师父学习善待每一只数据结构 考虑成环,那么高斯消元 然鹅这道题太小了 所以直接转移矩阵自乘就好啦 终点不向外连边 有一条向自己的,概率为一的自环来作为结尾 对于其他店 若有边\( ...

随机推荐

  1. 使用Navicat进行数据库对比同步

    使用Navicat进行数据库对比同步 当有多个数据库时,有时会出现结构或者数据不同步的问题,这时候可以使用navivat工具对比同步( 我的Navicat版本是11.0.17). 参考博客: 岁伏的博 ...

  2. 为什么zookeeper的节点配置的个数必须是奇数个?

    zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的.也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半, ...

  3. IText 生成pdf,处理table cell列跨页缺失的问题

    /**     * 创建(table)PDF,处理cell 跨页处理     * @param savePath(需要保存的pdf路径)     * @param pmbs (数据库查询的数据)    ...

  4. [Noip复习知识点][个人向]Zackzh

    只是列列一些要复习的,努力复习吧,有种noip退役的赶脚. 一.模拟 (这你也不会?退役吧) 二.DP 1.基础dp 2.区间dp 3.状压dp 4.树形dp 6.概率(期望)dp 7.环形dp 8. ...

  5. QT程序--CS1.6文件整理及安装器

    这是一个在高二的时候写的一个QT程序,当时对于QT也不算是特别熟悉吧,算是我第一个QT程序,当时由于CS1.6的文件安装的繁琐,又有一些服务器的管理的麻烦操作,对CS的服务器管理一直都很麻烦,当时高二 ...

  6. Java中的重写

    以下内容引用自http://wiki.jikexueyuan.com/project/java/overriding.html: 如果一个类从它的父类继承了一个方法,如果这个方法没有被标记为final ...

  7. Git入门使用

    Git入门使用 安装Git 软件包如: Git-2.7.2-32-bit_setup.1457942412.exe TortoiseGit-1.8.12.0-64bit.msi 安装时候,直接点下一步 ...

  8. 使用引导光盘,将你的PC变身瘦客户机

    很多国内使用VMware View桌面虚拟化产品的朋友问我,是否可以将自己现有的PC改造成一台瘦客户机呢? 一方面即可以得到桌面虚拟化的管理,安全的好处,而且连前端PC机的系统管理的工作都省了? 答案 ...

  9. Oracle 10g 升级至10.2.0.4

    http://weihaoluo.blog.163.com/blog/static/224418832010112102355652/   单实例环境 Vmware Server 1.0.6 +Cen ...

  10. Ajax系列之四:问题总结

    1.最经典的就是ie下的缓存问题了.  假设使用的是get.那么在ie下出现缓存问题.导致代码仅仅运行一次. 解决的方法就是加时间戳或者随机数,使url变为唯一,这样就不会出现ie  下的缓存问题了, ...