Zipper hdu 1501

这题首先就把题意理解错啦。。然后就把问题搞的相当复杂。。

这题的关键是记忆化。。对以前已经搜索过的状态标记下。。剪枝。

还有就是判断DFS结束条件和yes, no...

#include <stdio.h>
#include
<string.h>
#include
<stdlib.h>
#include
<algorithm>

char ch1[410], ch2[410], ch3[500], flag;
int len1, len2, len;
int hash[410][410];

void DFS(int n, int l1, int l2)
{
if (flag)
return ;

if (n == len)
{ flag
= 1;
return;
}
if (hash[l1][l2])
return;
if (ch3[n] == ch1[l1] && l1 < len1)
DFS(n
+ 1, l1 + 1, l2);
if (ch3[n] == ch2[l2] && l2 < len2)
DFS(n
+ 1, l1, l2 + 1);

hash[l1 ][l2]
= 1;
}


int main( )
{
int T, l = 0;
scanf(
"%d", &T);
while(T--)
{
flag
= 0;
l
++;
scanf(
"%s",ch1);
scanf(
"%s",ch2);
scanf(
"%s",ch3);
memset(hash,
0, sizeof(hash));
len1
= strlen(ch1);
len2
= strlen(ch2);
len
= strlen(ch3);
printf(
"Data set %d: ", l);
DFS(
0, 0, 0);
if (flag)
puts(
"yes");
else
puts(
"no");
}
return 0;
}

posted on 2011-08-12 17:22  more think, more gains  阅读(135)  评论(0编辑  收藏  举报

导航