`

HDU_1501_Zipper

阅读更多
http://acm.hdu.edu.cn/showproblem.php?pid=1501

题意:问第三个串是否能够拆成前2个串,字母顺序不可更改

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


记忆化搜索

#include <iostream>
using namespace std;

bool flag, hash[205][205];
int len, len1, len2;
char s[405], s1[205], s2[205];

void dfs (int i, int j, int k)	//字符串匹配型深搜,s1[i]和s2[j]分别跟s[k]匹配
{
    if (flag)
        return ;
    if (k == len)    //匹配成功
    {
        flag = true;
        return ;
    }
    if (hash[i][j])	//hash法记忆状态,若状态再次出现则已经不可能匹配成功,记忆化搜索
        return ;
    hash[i][j] = true;
    if (!flag && s1[i] == s[k])
        dfs (i+1, j, k+1);
    if (!flag && s2[j] == s[k])
        dfs (i, j+1, k+1);
}
int main()
{
    int t, x = 1;
    scanf ("%d", &t);
    while (t--)
    {
        scanf ("%s%s%s", s1, s2, s);
        len1 = strlen(s1);
        len2 = strlen(s2);
        len = strlen(s);
        memset (hash, false, sizeof(hash));
        flag = false;
        dfs (0, 0, 0);
        printf ("Data set %d: ", x++);
        if (flag)
            printf ("yes\n");
        else printf ("no\n");
    }
	return 0;
}
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics