您的位置:首页 > 其它

HDU 1501 Zipper

2014-02-18 16:07 302 查看
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1501

题意:给出字符串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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: