HDU 1501 Zipper

本文介绍了一个使用C++实现的算法,用于解决HDOJ1501问题。该问题要求判断两个字符串a和b是否同时为另一个字符串c的子序列。通过深度优先搜索(DFS)加记忆化搜索的方法,实现了高效求解。文章详细解释了算法思路,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地址: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值