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

输入: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的更多相关文章

  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. [luogu P2521] [HAOI2011]防线修建

    [luogu P2521] [HAOI2011]防线修建 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国 ...

  2. java打jar包小总结

    一 命令行方法 编译java 在bin目录下,也就是class所在目录下命令行输入如下命令进行归档处理 jar -cvf mylib.jar *.class 现在你可以看见一个已经生成的jar包了 此 ...

  3. 6种纯css实现loading效果

    1. <div id="loadingWrap1"> <span></span> <span></span> <s ...

  4. K8S配置安装全过程

    V1.11.1https://github.com/kubernetes/kubernetes/releases/tag/v1.11.1环境准备:系统:centos7.2.1511[root@mast ...

  5. Nodejs搭建基于express的应用,使用脚手架工具--express-generator

    1.安装nodejs 1> 去nodejs官网下载最新nodejs安装包,地址:http://nodejs.cn/download/,选择自己适合自己电脑系统的安装包,下载下来,然后一直next ...

  6. LVS初始使用步骤

    LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org. 现在L ...

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

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

  8. 第2次作业 -- 熟悉 JUnit 测试

    2.1 Mooctest 使用心得 Mooctest很方便,可以即时测评自己写的测试代码,获得覆盖率和报告,不需要自己安装配置环境 而且安装配置插件的环境也很简单,可以专注于测试本身 2.2 Juni ...

  9. Java第一个程序之HelloWorld

    代码实现如下图: 讲解: 1.主方法入口main():public static void main(string[] args){}是Java应用程序执行的入口点,必须提供该方法才能被执行: 2.打 ...

  10. QSSP软件一些参数的设置(远震波形合成)

    1.time window, sampling interval 这里需要注意的是两者的和必须是2的n次方,可以写成2047 1; 2046 2,或2047.75 0.25,2047.9 0.1等等 ...