链接:http://poj.org/problem?id=2192
和数塔一样,中间存在重复子问题。用一个数组记录是否被访问过,也就是记忆化搜索了。
#include <iostream> #include <string> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; bool dp[205][205]; bool flag; string sa, sb, sc; void DFS(int i, int j, int k) { if(k == sc.size()) { flag = true; return; } if(flag) return; if(dp[i][j]) return; dp[i][j] = true; if(i < sa.size() && sa[i] == sc[k]) { DFS(i + 1, j , k + 1); } if(j < sb.size() && sb[j] == sc[k]) { DFS(i, j + 1, k + 1); } } int main() { freopen("in.txt","r",stdin); int n; cin >> n; for(int i = 1; i <= n; i++) { cin >> sa >> sb >> sc; memset(dp, false, sizeof(dp)); flag = false; DFS(0, 0, 0); if(flag) { cout << "Data set " << i << ": yes" << endl; } else { cout << "Data set " << i << ": no" << endl; } sa.clear(); sb.clear(); sc.clear(); } return 0; }