HDU
来源:互联网 发布:异构数据库交互 编辑:程序博客网 时间:2024/06/05 18:33
原题链接
HDU 6170
分析
输入两个字符串
- 如果
s[i]==t[j] ||t[j] ==‘.’,则dp[i][j]=dp[i−1][j−1] - 如果
t[j] ==‘*’,分为下面两种情况。
(1)t[j−1] !=s[i] &&t[j−1] !=‘*’,此时‘*’不能匹配任何字符。所以dp[i][j]=dp[i][j−2]
(2) 除了(1)之外的情况,‘*’可以匹配0到多个s[i] 字符。 假设s[k...i] 是一段连续且相等的字符,则dp[i][j]=dp[k−1][j−2] ||dp[k][j−2] ||dp[k+1][j−2] || … ||dp[i][j]
但是如果这样写的话时间复杂度最坏可以达到
代码
#include <bits/stdc++.h>using namespace std;const int N = 2505;char s[N], t[N];int lens, lent;bool dp[N][N];bool sum[N];int main(){ //freopen("test.txt", "r", stdin); //freopen("out.txt", "w", stdout); int T; scanf("%d", &T); while (T--) { scanf("%s%s", s + 1, t + 1); lens = strlen(s + 1); lent = strlen(t + 1); memset(dp, false, sizeof(dp)); memset(sum, false, sizeof(sum)); for (int i = 0; i <= lens; i++) { for (int j = 0; j <= lent; j++) { if (!i && !j) { dp[0][0] = true; continue; } if (t[j] == s[i] || t[j] == '.') dp[i][j] = dp[i - 1][j - 1]; else if (t[j] == '*') { if (t[j - 1] != s[i] && t[j - 1] != '.') dp[i][j] = dp[i][j - 2]; else if (s[i] == s[i - 1]) dp[i][j] = sum[j - 2] || dp[i][j - 2]; else dp[i][j] = dp[i][j - 2] || dp[i - 1][j - 2]; } } for (int j = 0; j <= lent; j++) if (s[i] == s[i - 1]) sum[j] = sum[j] || dp[i][j]; else sum[j] = dp[i][j] || dp[i - 1][j]; } if (dp[lens][lent]) printf("yes\n"); else printf("no\n"); } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 带时间的日历控件
- 关于引用
- 《深入理解java虚拟机》学习-第七章-虚拟机类加载机制
- vue router 记住页面位置
- android串口通信
- HDU
- 利用递归思想删除php数组中特定value的元素
- 关于Malloc和free
- android图片处理方法
- BZOJ1014: [JSOI2008]火星人prefix
- 关于自媒体平台运营分析
- CSS选择符权重、CSS Sprite技术和CSS hack
- display兼容写法
- MySQL练习(一)