地址:http://acm.hdu.edu.cn/showproblem.php?pid=1501
题意:给出字符串a, b, c。判断a, b是否同时满足是c的子序列(a, b包含的字母不能重叠)
思路:DFS + 记忆化搜索。
题意:给出字符串a, b, c。判断a, b是否同时满足是c的子序列(a, b包含的字母不能重叠)
思路:DFS + 记忆化搜索。
代码:
#include <stdio.h>
#include <string.h>
int map[405][405]; // 注意数组大小
char a[201], b[201], c[405];
int len1, len2, len3, ans;
void dfs(int x, int y, int k) //三个元素同时进行搜索
{
if (map[x][y]) return; /*记忆化搜索*/
map[x][y] = 1; /*剪枝*/
if (k == len3)
ans = 1;
if (x < len1&&a[x] == c[k])
dfs(x + 1, y, k + 1);
if (y < len2&&b[y] == c[k])
dfs(x, y + 1, k + 1);
}
int main()
{
int t, D;
scanf("%d", &t);
while (t--)
{
scanf("%s%s%s", &a, &b, &c);
len1 = strlen(a);
len2 = strlen(b);
len3 = strlen(c);
memset(map, 0, sizeof(map));
ans = 0;
dfs(0, 0, 0);
printf("Data set %d: ", D++);
if (ans)
puts("yes");
else
puts("no");
}
return 0;
}