HDU6170 Two strings(动态规划)
来源:互联网 发布:灵犀一动知乎 编辑:程序博客网 时间:2024/06/13 12:16
【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=6170
题目意思
有两个字符串,问你第二个字符串和第一个字符串能否匹配,第二个字符串有两种符号,’.’可以匹配任意字符,’*’表示前一个字符可以重复零次或多次(0次也就是删除前一个字符)
解题思路
用dp[i][j]来表示b串第i个字符和前j个字符是否匹配。
当第i个字符为。时。由于‘。’可以匹配任意字符所以dp[i][j]=dp[i-1]
[j-1]。
当第i个字符为*
时。由于*
可以复制和删除所以分两种情况考虑。当复制0次和1次时:pd[i][j]=dp[i-2][j]|dp[i-1]j
当复制多次时:判断a[j]==a[j-1]?&&dp[i-1][j-1]和dp[i][j-1]是否匹配,如果都满足dp[i][j]也满足。
推荐个详细链接
http://blog.csdn.net/qq_28954601/article/details/77484676
代码部分
#include <bits/stdc++.h>using namespace std;const int maxn=2600;char a[maxn],b[maxn];bool dp[maxn][maxn];int lena,lenb;int main(){ int T; scanf("%d%*c",&T); while(T--) { memset(dp,false,sizeof(dp)); a[0]=b[0]=1; scanf("%s %s",a+1,b+1); lena = strlen(a) - 1; lenb = strlen(b) - 1; dp[0][0]=true; for(int i=1; i<=lenb; i++) { if(i>=2&&b[i]=='*') dp[i][0] |= dp[i-2][0]; for(int j=1; j<=lena; j++) { if(b[i]=='.'||a[j]==b[i]) dp[i][j]=dp[i-1][j-1]; else if(b[i]=='*') { dp[i][j]=dp[i-2][j]|dp[i-1][j]; ///判断删减一个和不复制情况 if((dp[i-1][j-1]||dp[i][j-1])&&a[j-1]==a[j]) ///判断复制情况 dp[i][j] = true; } } } puts(dp[lenb][lena]?"yes":"no"); } return 0;}
阅读全文
0 0
- HDU6170 Two strings(动态规划)
- HDU6170-Two strings
- HDU6170-Two strings
- hdu6170 Two strings【regex真好用】
- [正则表达式] hdu6170 two strings
- Two strings hdu6170 dp递推
- HDU6170-Two strings 多校9 dp
- hdu6170-多看几遍之DP&递推&字符串-Two strings
- HDU6170 Two strings dp 多校联赛第9场
- 712. Minimum ASCII Delete Sum for Two Strings(动态规划)
- HDU6170 Two strings(dp,2017 HDU多校联赛 第9场)
- leetcode 583. Delete Operation for Two Strings 最长公共子串 + DP动态规划
- 【动态规划】Alternating Strings Gym
- hdu6170(dp)
- hdu6170
- HDU4745 Two Rabbits 动态规划
- 【动态规划】HDU 5791 Two
- Gym 100712D Alternating Strings 动态规划
- Refletion2017.9.10
- 53. Maximum SubArray(divide and conquer)
- C++ 标准库 vector类型
- Python OpenCV获取视频
- 深入理解MyBatis(六)—MyBatis的缓存机制
- HDU6170 Two strings(动态规划)
- Gradle学习系列之十——自定义Plugin
- C++对象切割
- java异常·超出打开游标最大值
- 推送
- 阶乘
- 1. Two Sum
- 数据库总结之字段语法
- CCF-201409-1-相邻数对