hdu-3689 Infinite monkey theorem 概率dp+kmp
有一只猴子随机敲键盘,给出它可能敲的键以及敲各个键的概率。
输入:n,表示有多少个键,m,表示猴子会敲m次键
n个二元组(字母,数字)
表示键代表的字母及其被敲的概率。
最后一个目标字符串。
问这只猴子敲了m次键后得到的字符串包含目标字符串的概率。
最主要的还是怎么定义出具有无后效性的状态。
用dp[i][j]表示扫描第i位,前面未曾出现完全匹配并且后缀与target已匹配长度为j的概率
然后模仿kmp匹配的过程进行dp就可以了。
AC代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int MAXN=;
- const int MAXLEN=;
- int n,m;
- double p[MAXN];
- char target[];
- double dp[MAXLEN][]; //dp[i][j]表示扫描第i位,前面未曾出现完全匹配&&后缀与target已匹配长度为j的概率
- int nxt[];
- double ans;
- void init()
- {
- for(int i=;i<MAXN;++i) p[i]=0.0;
- ans=;
- for(int i=;i<=m;++i)
- {
- for(int j=;j<;++j)
- {
- dp[i][j]=0.0;
- }
- }
- dp[][]=1.0;
- }
- void Input()
- {
- char c,t;
- for(int i=;i<=n;++i)
- {
- scanf("%c%c",&t,&c);
- cin>>p[c-'a'];
- }
- scanf("%s",target);
- }
- void getnxt(char P[])
- {
- nxt[]=;
- int len=strlen(P),k=;
- for(int i=;i<len;++i)
- {
- while(k&&P[i]!=P[k]) k=nxt[k-];
- if(P[i]==P[k]) ++k;
- nxt[i]=k;
- }
- }
- void work()
- {
- int len=strlen(target);
- getnxt(target);
- for(int i=;i<=m;++i)
- {
- for(int k=;k<;++k)
- {
- for(int j=;j<=len;++j)
- {
- int now=j-;
- while(now&&target[now]!=k+'a') now=nxt[now-];
- if(target[now]==k+'a')
- {
- dp[i][now+]+=dp[i-][j-]*p[k];
- }
- else dp[i][]+=dp[i-][j-]*p[k];
- }
- }
- ans+=dp[i][len];
- }
- }
- int main()
- {
- while(scanf("%d%d",&n,&m)==&&(n+m))
- {
- init();
- Input();
- work();
- printf("%.2f%%\n",*ans);
- }
- return ;
- }
hdu-3689 Infinite monkey theorem 概率dp+kmp的更多相关文章
- 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 ...
- 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 ...
- HDU 3689 Infinite monkey theorem [KMP DP]
Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu 3689 Infinite monkey theorem
Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- ●HDU 3689 Infinite monkey theorem
题链: http://acm.hdu.edu.cn/showproblem.php?pid=3689题解: KMP,概率dp (字符串都从1位置开始) 首先对模式串S建立next数组. 定义dp[i] ...
- [HDU 3689]Infinite monkey theorem (KMP+概率DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3689 黄老师说得对,题目只有做wa了才会有收获,才会有提高. 题意:一个猴子敲键盘,键盘上有n个键,猴 ...
- HDU 3689 Infinite monkey theorem ——(自动机+DP)
这题由于是一个单词,其实直接kmp+dp也无妨.建立自动机当然也是可以的.设dp[i][j]表示匹配到第i个字母的时候,在单词中处于第j个位置的概率,因此最终的答案是dp[0~m][len],m是输入 ...
- [AC自己主动机+可能性dp] hdu 3689 Infinite monkey theorem
意甲冠军: 给n快报,和m频率. 然后进入n字母出现的概率 然后给目标字符串str 然后问m概率倍的目标字符串是敲数量. 思维: AC自己主动机+可能性dp简单的问题. 首先建立trie图,然后就是状 ...
- HUD3689 Infinite monkey theorem
Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
随机推荐
- 解决libVLC无法响应鼠标消息
参考: https://blog.jianchihu.net/player-based-on-libvlc.html 自己在Qt上的实现: 头文件 libvlc_instance_t * m_inst ...
- 网络通信协议,TCP和UDP 的区别
1.网络通信 互联网本质就是一系列的网络通信,互联网协议的功能是定义计算机如何介入internet,以及介入internet的计算机通信的标准.互联网协议按照功能不同分为osi7层或tcp/ip五 ...
- Mac下如何配置环境变量JDK
1.在英文输入法的状态下,按键盘“Ctrl + 空格”组合键,调出Spotlight搜索,在这里可以快速启动终端,输入ter,然后回车,即可打开终端: 2.如果你是第一次配置环境变量,可以使用“tou ...
- js--map函数的使用
map( ) 属于操作数组的方法. 包含三个参数,item,index,arr 看一份代码: let arr = [ {title:'aaa',hot:true}, {title:'fff',hot ...
- PPT母版制作
选择母版 首先,去iSlide官网下载iSlide,下载iSlide后,power point的菜单栏会自动出现iSilde图标(如下图). 打开iSlide这一栏,点击“图示库”,会弹出一个窗口,就 ...
- react-redux-store
store是联系state 和 reducer的部分 Store 有以下职责: 维持应用的 state: 提供 getState() 方法获取 state: 提供 dispatch(action) 方 ...
- python基础之作业1---用户登录
作业:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 import sys, os, getpass os.system('clear')i = 0while i < 3: ...
- 第一周博客之二---OA项目环境搭建及开发包部署
OA项目环境搭建 一个项目想要能够在开发人员打包好项目包之后进行测试,就必须进行项目测试环境的搭建,要根据开发工程师的开发环境采用不同的测试环境,以下只是浅谈下Java项目OA(办公自动化平台)的环境 ...
- Windows挂载NFS共享盘
Centos7添加NFS方法请见如下链接: https://www.cnblogs.com/jackyzm/p/10285845.html 一:添加NFS服务 1.1:此电脑-右键-管理-window ...
- 保存eclipse个人配置的几种方式
本人用eclipse做Java开发之前,往往要设置下eclipse的背景,字体,颜色,以便保护眼睛.但这些数据是放在workspaces里的,一旦新建workspace所有要重新调整,很麻烦,于是尝试 ...