Hdu 1501 Zipper【dfs】

原创 2016年05月31日 19:52:54

Zipper

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9212 Accepted Submission(s): 3263


Problem Description
Given three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, but each must stay in its original order.

For example, consider forming "tcraete" from "cat" and "tree":

String A: cat
String B: tree
String C: tcraete


As you can see, we can form the third string by alternating characters from the two strings. As a second example, consider forming "catrtee" from "cat" and "tree":

String A: cat
String B: tree
String C: catrtee


Finally, notice that it is impossible to form "cttaree" from "cat" and "tree".

Input
The first line of input contains a single positive integer from 1 through 1000. It represents the number of data sets to follow. The processing for each data set is identical. The data sets appear on the following lines, one data set per line.

For each data set, the line of input consists of three strings, separated by a single space. All strings are composed of upper and lower case letters only. The length of the third string is always the sum of the lengths of the first two strings. The first two strings will have lengths between 1 and 200 characters, inclusive.


Output
For each data set, print:

Data set n: yes

if the third string can be formed from the first two, or

Data set n: no

if it cannot. Of course n should be replaced by the data set number. See the sample output below for an example.

Sample Input
3 cat tree tcraete cat tree catrtee cat tree cttaree

Sample Output
Data set 1: yes Data set 2: yes Data set 3: no

Source


非常简单的dfs ,结果各种错误都犯了.......


#include<cstdio>
#include<cstring>
const int maxn=1005;
char a[maxn],b[maxn],c[2*maxn];
bool vis[maxn][maxn],kase;
void dfs(int la,int lena,int lb,int lenb)
{
	if(la>lena||lb>lenb||vis[la][lb])
	{
		return;
	}
	if(la==lena&&lb==lenb)
	{
		kase=1;
		return;
	}
	vis[la][lb]=1;
	if(!kase&&a[la]==c[la+lb])
	{
		dfs(la+1,lena,lb,lenb);
	}
	if(!kase&&b[lb]==c[la+lb])
	{
		dfs(la,lena,lb+1,lenb);
	}
}
int main()
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		kase=0;
		memset(vis,0,sizeof(vis));
		scanf("%s%s%s",a,b,c);
		printf("Data set %d: ",i);
		dfs(0,strlen(a),0,strlen(b));
		printf("%s\n",kase?"yes":"no");
	}
	return 0;
}


#include<stdio.h>
#include<string.h>
const int maxn=205;
char a[maxn],b[maxn],c[maxn*2];
bool vis[maxn][maxn];
bool ok(int la,int lena,int lb,int lenb)
{
	if(la==lena&&lb==lenb)
	{
		return 1;
	}
	int kase=0;
    if((la<lena||lb<lenb)&&!vis[la][lb])
    {
    	vis[la][lb]=1;
        if(a[la]==c[la+lb])
        {
            kase=ok(la+1,lena,lb,lenb);
        }
        if(b[lb]==c[la+lb])
        {
            kase=kase||ok(la,lena,lb+1,lenb);
        }
    }
    return kase;
}
int main()
{
    int t,i,j,k,l;
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
    	memset(vis,0,sizeof(vis));
        scanf("%s%s%s",a,b,c);
        printf("Data set %d: ",i);
        printf("%s\n",ok(0,strlen(a),0,strlen(b))?"yes":"no");
    }
    return 0;
} 



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU-1501 Zipper DFS+记忆化搜索

博客园社区首页新随笔联系管理订阅 随笔- 649  文章- 10  评论- 54  HDU-1501 Zipper DFS+记忆化搜索    ...

HDU:1501 Zipper(DFS+剪枝)

Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S...
  • zugofn
  • zugofn
  • 2017年03月22日 19:20
  • 244

HDU1501 - Zipper - dfs

1.题目描述: Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth...

hdu1501 Zipper(dfs && dp)

挺不错的题。第一反应是模拟字符串匹配,但第二个样例就否定了。 str1 = cat, str2 =  tree, str = catrtee,当主串匹配到第四个字符t时,问题来了,是匹配第一个的还是...

hdu1501 Zipper DFS带剪枝

Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S...

hdu1501 Zipper--DFS

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1501 一:原题内容 Problem Description Given three stri...
  • LaoJiu_
  • LaoJiu_
  • 2015年12月26日 21:12
  • 1192

HDU-1501 (POJ-2192) Zipper (DFS||DP)

要不是放在dp专题里面,我还一直以为只能dfs做 看到一个dp的解法,才明白如何进行状态转移 设dp[i][j]表示串a的前i个字符与串b的前j个字符是否能形成串c的前i+j个字符, 若dp[i-1...

ACM-DFS之Zipper——hdu1501

ACM DFS 搜索 hdu1501 Zipper

Zipper(HDU 1501) —— DFS

Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S...

hdu1501Zipper -- 经典DFS

经典的DFS 题意:有3个字符串,问第三个字符串能否有前2个字符串拼接起来,拼接时前2个字符串中字符在新字符串中的先后相对位置不能改变。 思路:DFS,前2个字符串,从前向后搜索看能否能拼成第三个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hdu 1501 Zipper【dfs】
举报原因:
原因补充:

(最多只允许输入30个字)