HDU 3689 (KMP+DP || 暴力+dp)
来源:互联网 发布:centos phpbrew 编辑:程序博客网 时间:2024/05/22 13:57
由于匹配串比较小,也可暴力
dp[i][j]表示输入第i个字符模式串匹配到第j个字符的概率。
KMP+DP如下:
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;typedef long long LL;const int maxn = 30;char s[maxn], c[maxn];double dp[1007][maxn];double p[maxn];int Next[maxn], n, m, len;void getNext() { Next[1] = 0; int j = 0; for(int i = 2; i <= len; ++i) { while(j && s[j+1] != s[i]) j = Next[j]; if(s[j+1] == s[i]) j++; Next[i] = j; }}int main() { while(scanf("%d%d", &n, &m)) { if(!n && !m) break; memset(dp, 0, sizeof(dp)); getchar(); for(int i = 1; i <= n; ++i) scanf("%c %lf\n", &c[i], &p[i]); scanf("%s", s+1); len = strlen(s+1); getNext(); dp[0][0] = 1; for(int i = 0; i < m; ++i) { for(int j = 0; j < len; ++j) { for(int k = 1; k <= n; ++k) { int pos = j; while(pos && s[pos+1] != c[k]) pos = Next[pos]; if(s[pos+1] == c[k]) pos++; dp[i+1][pos] += dp[i][j]*p[k]; } } } double ans = 0.0; for(int i = 0; i <= m; ++i) ans += dp[i][len]; printf("%.2lf%%\n", ans*100); }}
0 0
- HDU 3689 (KMP+DP || 暴力+dp)
- hdu 4552 怪盗基德的挑战书【KMP+dp || 优雅暴力】
- HDU 3336 KMP+DP
- hdu 4552(KMP+DP)
- hdu 3336 KMP+DP
- HDU 5763 dp+kmp
- hdu 3336 Kmp+dp
- hdu 5763 kmp + dp
- hdu 5763(kmp + dp)
- hdu 4468 spy kmp+dp
- [kmp+dp] hdu 4628 Pieces
- HDU Another Meaning DP+KMP
- Hdu 2089 不要62 (暴力/数位dp)
- hdu 4681 String(暴力&dp&LCS)
- HDU 5074 Hatsune Miku 暴力dp
- hdu 5311 Hidden String(dp+暴力dfs)
- HDU 5001 Walk(暴力+概率DP)
- HDU 5074 Hatsune Miku(暴力+DP)
- JAVA集合容器--Vector
- spring四种依赖注入方式
- source.android.com-source-overview
- R语言之朴素贝叶斯算法应用
- [JllServer] CPU:I7_6700 MainBoard: ASUS_Z170_AR 安装时黑屏时的处理
- HDU 3689 (KMP+DP || 暴力+dp)
- Android之APK的下载安装
- hdu 5782 Cycle (2016多校第五场1002) 后缀数组
- 神经网络抵制过拟合神器:Dropout 手把手论文入门 — 深度学习 DL 番外篇
- C#控制台基础 helloworld之 用类中的EventHandler委托的事件输出
- 身份认证技术
- Fragment设计技巧
- Android OpenCV 实例笔记1--Jni及OpenCV环境的搭建
- 剑指Offer:树的子结构