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/ ...
随机推荐
- oracle 12g,断电,数据库启动不了,无法登录 并且 报ora-00119和ora-00132错误
oracle 12g,断电,数据库启动不了,无法登录 前提:服务全部打开,监听也配置好了! 可以参考网站:https://jingyan.baidu.com/article/5552ef47c73ee ...
- css3 翻牌动画
最近做了一个特效,css是从网上找的,地址是这个: CSS3 animate flip下的纸牌翻转效果实例页面 把其中核心的css代码扒出来如下: /* The properties in this ...
- s6k0:一种输入法分词关联模型演示
实现:用kotlin.但是考虑到习惯问题,需要借助akka实现erlang的actor,以及rx.java 需求:略 预计:最快两周 保守估计时间:2019年3月左右 优先级:低 加速方法:打饭钱 赞 ...
- 2ci
- maven项目的配置
软件151 王帅 1.增加web.xml Maven项目最重要的配置文件是pom.xml,pom是“项目对象模型”的意思.现在pom.xml中有一个错误,提示缺少web.xml: 展开目录src—m ...
- js-notebook
注意DOM和BOM的区别,ECMAScript只针对js的语法核心,实际大部分浏览器里的js = ECMAScript + DOM + BOM, 而nodejs里就只包括core js 隐性的toSt ...
- elasticsearch kabana中创建索引
在kabana中创建索引和索引类型语法 PUT clockin{ "mappings": { "time": { } }} 查询索引下的所有数据 GET clo ...
- Exploit-Exercises nebule 旅行日志(二)
接着上次的路程继续在ubuntu下对漏洞的探索练习,这次是level01了 先看下level01的问题描述: 目标还是要能运行getflag这个可执行的程序,但如果直接运行是不行的,会提示: getf ...
- P3957 跳房子
题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一条直线上.每个格子内 ...
- `TypeError: torch.mm received an invalid combination of arguments - got (torch.FloatTensor, Variable),
`TypeError: torch.mm received an invalid combination of arguments - got (torch.FloatTensor, Variable ...