Zipper HDU - 1501

原题链接

考察:记忆化搜索

太菜了太菜了,说实话本蒟蒻完全没看出来为什么要用记忆化搜索.T了两次算了搞明白了点.

       假定数据: a = aaa,b = aaa, c = aaaaaw. 很容易看出答案是错的,但是dfs会不断搜索,在返回的时候,用了b一个字符会在优先使用a一个字符.而此状态被搜索过,因此要用数据记录搜索过的状态以节约时间

思路:

        用bool数组记录搜索过的状态,dfs的返回值判断是否构造成功.

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int N = 210;
 6 char a[N],b[N],c[N<<1];
 7 bool st[N][N];
 8 bool dfs(int i,int j,int k)
 9 {
10     if(c[k]=='\0') return 1;
11     if(st[i][j]) return 0;//避免搜过的状态 
12     st[i][j] = 1;//标记搜过 
13     if(a[i]==c[k]&&dfs(i+1,j,k+1)) return 1;
14     if(b[j]==c[k]&&dfs(i,j+1,k+1)) return 1; 
15     return 0;
16 }
17 int main()
18 {
19     int T,kcase = 0;
20     scanf("%d",&T);
21     while(T--)
22     {
23         memset(st,0,sizeof st);
24         scanf("%s%s%s",a+1,b+1,c+1);
25         printf("Data set %d: %s\n",++kcase,(dfs(1,1,1)?"yes":"no"));
26     }
27     return 0;
28 }

 

posted @ 2021-02-17 23:48  acmloser  阅读(54)  评论(0编辑  收藏  举报