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 }