有一只猴子随机敲键盘,给出它可能敲的键以及敲各个键的概率。

输入:n,表示有多少个键,m,表示猴子会敲m次键

n个二元组(字母,数字)

表示键代表的字母及其被敲的概率。

最后一个目标字符串。

问这只猴子敲了m次键后得到的字符串包含目标字符串的概率。

最主要的还是怎么定义出具有无后效性的状态。

用dp[i][j]表示扫描第i位,前面未曾出现完全匹配并且后缀与target已匹配长度为j的概率

然后模仿kmp匹配的过程进行dp就可以了。

AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN=;
  4. const int MAXLEN=;
  5. int n,m;
  6. double p[MAXN];
  7. char target[];
  8. double dp[MAXLEN][]; //dp[i][j]表示扫描第i位,前面未曾出现完全匹配&&后缀与target已匹配长度为j的概率
  9. int nxt[];
  10. double ans;
  11. void init()
  12. {
  13. for(int i=;i<MAXN;++i) p[i]=0.0;
  14. ans=;
  15. for(int i=;i<=m;++i)
  16. {
  17. for(int j=;j<;++j)
  18. {
  19. dp[i][j]=0.0;
  20. }
  21. }
  22. dp[][]=1.0;
  23. }
  24. void Input()
  25. {
  26. char c,t;
  27. for(int i=;i<=n;++i)
  28. {
  29. scanf("%c%c",&t,&c);
  30. cin>>p[c-'a'];
  31. }
  32. scanf("%s",target);
  33. }
  34. void getnxt(char P[])
  35. {
  36. nxt[]=;
  37. int len=strlen(P),k=;
  38. for(int i=;i<len;++i)
  39. {
  40. while(k&&P[i]!=P[k]) k=nxt[k-];
  41. if(P[i]==P[k]) ++k;
  42. nxt[i]=k;
  43. }
  44. }
  45. void work()
  46. {
  47. int len=strlen(target);
  48. getnxt(target);
  49. for(int i=;i<=m;++i)
  50. {
  51. for(int k=;k<;++k)
  52. {
  53. for(int j=;j<=len;++j)
  54. {
  55. int now=j-;
  56. while(now&&target[now]!=k+'a') now=nxt[now-];
  57. if(target[now]==k+'a')
  58. {
  59. dp[i][now+]+=dp[i-][j-]*p[k];
  60. }
  61. else dp[i][]+=dp[i-][j-]*p[k];
  62. }
  63. }
  64. ans+=dp[i][len];
  65. }
  66. }
  67. int main()
  68. {
  69. while(scanf("%d%d",&n,&m)==&&(n+m))
  70. {
  71. init();
  72. Input();
  73. work();
  74. printf("%.2f%%\n",*ans);
  75. }
  76. return ;
  77. }

hdu-3689 Infinite monkey theorem 概率dp+kmp的更多相关文章

  1. hdu 3689 杭州 10 现场 J - Infinite monkey theorem 概率dp kmp 难度:1

    J - Infinite monkey theorem Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &am ...

  2. HDU 3689 Infinite monkey theorem(DP+trie+自动机)(2010 Asia Hangzhou Regional Contest)

    Description Could you imaging a monkey writing computer programs? Surely monkeys are smart among ani ...

  3. HDU 3689 Infinite monkey theorem [KMP DP]

    Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...

  4. hdu 3689 Infinite monkey theorem

    Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  5. ●HDU 3689 Infinite monkey theorem

    题链: http://acm.hdu.edu.cn/showproblem.php?pid=3689题解: KMP,概率dp (字符串都从1位置开始) 首先对模式串S建立next数组. 定义dp[i] ...

  6. [HDU 3689]Infinite monkey theorem (KMP+概率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3689 黄老师说得对,题目只有做wa了才会有收获,才会有提高. 题意:一个猴子敲键盘,键盘上有n个键,猴 ...

  7. HDU 3689 Infinite monkey theorem ——(自动机+DP)

    这题由于是一个单词,其实直接kmp+dp也无妨.建立自动机当然也是可以的.设dp[i][j]表示匹配到第i个字母的时候,在单词中处于第j个位置的概率,因此最终的答案是dp[0~m][len],m是输入 ...

  8. [AC自己主动机+可能性dp] hdu 3689 Infinite monkey theorem

    意甲冠军: 给n快报,和m频率. 然后进入n字母出现的概率 然后给目标字符串str 然后问m概率倍的目标字符串是敲数量. 思维: AC自己主动机+可能性dp简单的问题. 首先建立trie图,然后就是状 ...

  9. HUD3689 Infinite monkey theorem

    Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

随机推荐

  1. 解决libVLC无法响应鼠标消息

    参考: https://blog.jianchihu.net/player-based-on-libvlc.html 自己在Qt上的实现: 头文件 libvlc_instance_t * m_inst ...

  2. 网络通信协议,TCP和UDP 的区别

    1.网络通信   互联网本质就是一系列的网络通信,互联网协议的功能是定义计算机如何介入internet,以及介入internet的计算机通信的标准.互联网协议按照功能不同分为osi7层或tcp/ip五 ...

  3. Mac下如何配置环境变量JDK

    1.在英文输入法的状态下,按键盘“Ctrl + 空格”组合键,调出Spotlight搜索,在这里可以快速启动终端,输入ter,然后回车,即可打开终端: 2.如果你是第一次配置环境变量,可以使用“tou ...

  4. js--map函数的使用

    map( )  属于操作数组的方法. 包含三个参数,item,index,arr 看一份代码: let arr = [ {title:'aaa',hot:true}, {title:'fff',hot ...

  5. PPT母版制作

    选择母版 首先,去iSlide官网下载iSlide,下载iSlide后,power point的菜单栏会自动出现iSilde图标(如下图). 打开iSlide这一栏,点击“图示库”,会弹出一个窗口,就 ...

  6. react-redux-store

    store是联系state 和 reducer的部分 Store 有以下职责: 维持应用的 state: 提供 getState() 方法获取 state: 提供 dispatch(action) 方 ...

  7. python基础之作业1---用户登录

    作业:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 import sys, os, getpass os.system('clear')i = 0while i < 3: ...

  8. 第一周博客之二---OA项目环境搭建及开发包部署

    OA项目环境搭建 一个项目想要能够在开发人员打包好项目包之后进行测试,就必须进行项目测试环境的搭建,要根据开发工程师的开发环境采用不同的测试环境,以下只是浅谈下Java项目OA(办公自动化平台)的环境 ...

  9. Windows挂载NFS共享盘

    Centos7添加NFS方法请见如下链接: https://www.cnblogs.com/jackyzm/p/10285845.html 一:添加NFS服务 1.1:此电脑-右键-管理-window ...

  10. 保存eclipse个人配置的几种方式

    本人用eclipse做Java开发之前,往往要设置下eclipse的背景,字体,颜色,以便保护眼睛.但这些数据是放在workspaces里的,一旦新建workspace所有要重新调整,很麻烦,于是尝试 ...