HDU 6170----Two strings(DP)
2018-06-17 22:00:01来源:未知 阅读 ()
题目链接
The first string contains lowercase letters and uppercase letters.
The second string contains lowercase letters, uppercase letters, and special symbols: “.” and “*”.
. can match any letter, and * means the front character can appear any times. For example, “a.b” can match “acb” or “abb”, “a*” can match “a”, “aa” and even empty string. ( “*” will not appear in the front of the string, and there will not be two consecutive “*”.
For each test case, there are two lines implying the two strings (The length of the two strings is less than 2500).
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int N=2505; char a[N],b[N]; int len1,len2; int dp[N][N]; int main() { int T; cin>>T; while(T--){ scanf("%s%s",a+1,b+1); len1=strlen(a+1); len2=strlen(b+1); memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=1;i<=len2;i++) { if(b[i]=='.') { for(int j=0;j<=len1;j++) { if(dp[i-1][j]) dp[i][j+1]=1; } } else if(b[i]=='*') { for(int j=0;j<=len1;j++) { if(dp[i-1][j]) { dp[i][j]=1; dp[i][j-1]=1; while(a[j+1]==a[j]) dp[i][j+1]=1,j++; } } } else { for(int j=0;j<=len1;j++) { if(!dp[i-1][j]) continue; if(a[j+1]==b[i]) dp[i][j+1]=1; else if(b[i+1]=='*') dp[i+1][j]=1; } } } if(dp[len2][len1]) puts("yes"); else puts("no"); } return 0; } /* .*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* */
比赛中我用的深搜模拟的,会超时,但是如果答案是"yes"的话,会很快的计算出,不会超时;如果是” no "的话,会搜索所有的情况,会超时,这个时候我们可以用一个变量记录一下递归次数,当大于一定次数时默认为“no”的情况,退出搜索。(当然这种做法不是正解,脑洞大开,如果有厉害的数据肯定过不了~)
代码如下:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int N=2505; char a[N],b[N]; int len1,len2; int h[N]; int c; int dfs(int i,int j) { c++; if(c>1000000) return 0;///默认为"no"的情况; if(i<len1 && j>=len2) return 0; if(i>=len1){ if(j>=len2) return 1; if(j==len2-1 && b[j]=='*') return 1; if(j==len2-1 && b[j]!='*') return 0; if(j<len2-1){ if(b[j]=='*' && h[j+1]) return 1; else if(b[j]!='*' && h[j]) return 1; else return 0; } } if(b[j]=='.') { b[j]=a[i]; int f=dfs(i+1,j+1); b[j]='.'; return f; } if(b[j]=='*') { if(a[i]==b[j-1]){ if(dfs(i+1,j)) return 1; if(dfs(i,j+1)) return 1; if(dfs(i-1,j+1)) return 1; } else { if(dfs(i-1,j+1)) return 1; if(dfs(i,j+1)) return 1; } } if(a[i]==b[j]) return dfs(i+1,j+1); else if(b[j+1]=='*') return dfs(i,j+2); else return 0; } int main() { int T; cin>>T; while(T--){ scanf("%s%s",a,b); c=0; len1=strlen(a); len2=strlen(b); int flag=1; for(int i=len2-1;i>=0;i--) { if(!flag) h[i]=0; else if(b[i]=='*'){ h[i]=1; h[i-1]=1; i--; } else{ h[i]=0; flag=0; } } int ans=dfs(0,0); if(ans) puts("yes"); else puts("no"); } return 0; } /* .*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* */
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:C/C++资料网站
- 【题解】Building Strings Gym - 102152E 2020-03-31
- HDU-2955-Robberies(0-1背包) 2020-03-30
- CodeForces 1320D - Reachable Strings 2020-03-20
- hdu1455 拼木棍(经典dfs) 2020-02-29
- anniversary party_hdu1520 2020-02-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash