题意 判断能否由字符串a,b中的字符不改变各自的相对顺序组合得到字符串c
本题有两种解法 DP或者DFS
考虑DP 令d[i][j]表示能否有a的前i个字符和b的前j个字符组合得到c的前i+j个字符 值为0或者1 那么有d[i][j]=(d[i-1][j]&&a[i]==c[i+j])||(d[i][j-1]&&b[i]==c[i+j]) a,b的下标都是从1开始的 注意0的初始化
#include<cstdio> #include<cstring> using namespace std; const int N = 205; char a[N], b[N], c[2 * N]; bool d[N][N]; int main() { int cas; scanf ("%d", &cas); for (int k = 1; k <= cas; ++k) { scanf ("%s%s%s", a + 1, b + 1, c + 1); int la = strlen (a + 1), lb = strlen (b + 1), i = 1, j = 1; memset (d, 0, sizeof (d)); while (a[i] == c[i] && i <= la) d[i++][0] = true; while (b[j] == c[j] && j <= lb) d[0][j++] = true; for (int i = 1; i <= la; ++i) for (int j = 1; j <= lb; ++j) d[i][j] = ( (d[i - 1][j] && a[i] == c[i + j]) || (d[i][j - 1] && b[j] == c[i + j])); printf ("Data set %d: ", k); printf (d[la][lb] ? "yes\n" : "no\n"); } return 0; }
下面是dfs的代码 看能否在ab中对应搜到c的每一个字母就可
//DFS版 #include <cstdio> #include <cstring> using namespace std; const int N = 205; char a[N], b[N], c[2 * N]; bool vis[N][N], ans; void dfs (int i, int j, int k) { if (c[k] == '\0') ans = true; if (ans || vis[i][j]) return ; vis[i][j] = true; if (a[i] == c[k]) dfs (i + 1, j, k + 1); if (b[j] == c[k]) dfs (i, j + 1, k + 1); } int main() { int cas; scanf ("%d", &cas); for (int ca = 1; ca <= cas; ++ca) { ans = false; memset (vis, 0, sizeof (vis)); scanf ("%s%s%s", a, b, c); dfs (0, 0, 0); printf ("Data set %d: ", ca); printf (ans ? "yes\n" : "no\n"); } return 0; }
3 cat tree tcraete cat tree catrtee cat tree cttaree
Data set 1: yes Data set 2: yes Data set 3: no
HDU 1501 Zipper(DP,DFS),布布扣,bubuko.com
原文地址:http://blog.csdn.net/iooden/article/details/38655287