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/ ...
随机推荐
- [bzoj P2726] [SDOI2012]任务安排
[bzoj P2726] [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1204 Solved: 349[Submit] ...
- Django全文检索(django-haystack+whoosh+jieba)
前言: 全文检索就是针对所有内容进行动态匹配搜索的概念,针对特定的关键词建立索引并精确匹配达到性能优化的目的 class Whoose_seach(object): analyzer = Chines ...
- postman-SSL证书问题-支持HTTPS请求
使用Google接口调试插件postman请求https协议的接口,postman提示: 为此,需要解决这个问题,提示信息已经给出了解决方案!Using self-signed SSL certifi ...
- scatter参数
列出scatter常用的一些参数: plt.scatter(x,y,c= '颜色可选',marker= '点的样式', cmap= '颜色变化',alpha=“透明度”, linewidths=“线宽 ...
- javascript数据基本类型和引用数据类型区别
基本类型和引用数据类型区别 1.基本数据类型和引用数据类型 javascript中有两种数据类型,分别是基本数据类型和引用数据类型: 基本数据(原始数据)类型指的是简单的数据段,而引用数据类型则指的是 ...
- maven安装与基本配置
maven安装与基本配置 依赖:java环境,JDK安装 一. maven安装 (一)下载maven (二)安装与环境变量设置 (三)maven setting.xml配置 二. 创建maven项目 ...
- 活代码LINQ——06
一.模块代码 ' Fig. 9.4: LINQWithArrayOfObjects.vb ' LINQ to Objects using an array of Employee objects. M ...
- 安装CaffeOnSpark过程中遇到的问题及解决方案
安装教程来自 http://blog.csdn.net/sadonmyown/article/details/72781393 首先,我使用的节点环境是ubuntu 16.04.1,事先 成功安装了s ...
- 其他知识点,API
日期和Math 获取2017-06-10格式的日期 Date.now() //当前时间毫秒数 var dt=new Date() dt.getTime() //毫秒数 dt.getFullYear() ...
- python简单爬虫 用beautifulsoup爬取百度百科词条
目标:爬取“湖南大学”百科词条并处理数据 需要获取的数据: 源代码: <div class="basic-info cmn-clearfix"> <dl clas ...