您的位置:首页 > 其它

HDU1501 Zipper(DFS+记忆化搜索)

2017-01-21 23:41 381 查看
题意:给三个字符串,保证第三个串长度是前两个串长度之和,确定前两个串保持原有的字母顺序能不能拼成第三个串。

思路:直接搜索的话会有大量重复的运算,要用记忆化数组记录之前的结果。当匹配到第一个串的第i位和第二个串的第j位时,前面可能有多种情况,但三个串后面的长度一定,所以结果也可以确定,用vis[i][j]记录当前状态是否匹配过。

//#include<bits/stdc++.h>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;
char s1[205],s2[205],s3[405];
int vis[205][205],f;
void dfs(int i,int j){
if(f)return;
if(s1[i]=='\0'&&s2[j]=='\0'){
f=1;
return;
}
vis[i][j]=1;//记录当前状态
if(s3[i+j]!=s1[i]&&s3[i+j]!=s2[j]){
return;
}
if(s3[i+j]==s1[i]&&!vis[i+1][j]){
dfs(i+1,j);
}
if(s3[i+j]==s2[j]&&!vis[i][j+1]){
dfs(i,j+1);
}
}
int main(){
int n,k=0;
scanf("%d",&n);
getchar();
while(n--){
scanf("%s%s%s",s1,s2,s3);
memset(vis,0,sizeof(vis));//vis初始化为0
f=0;
dfs(0,0);
printf("Data set %d: ",++k);
if(f)puts("yes");
else puts("no");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu 搜索 dfs