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) 编辑 收藏 举报