给你三个字符串,问你前两个能不能拼成第三个串。
思路:
直接记忆化神搜就行,思路水,看下代码就知道了。这个题目我感觉最大公共子序列dp的作法是错的,虽然有人ac了,随便一组数据比如 abc abc abccba。
#include<stdio.h> #include<string.h> char c1[222] ,c2[222] ,c3[444]; int mark[222][222]; int ok ,l1 ,l2 ,l3; void DFS(int n1 ,int n2 ,int n3) { if(n3 == l3 + 1) { ok = 1; return ; } if(mark[n1][n2]) return; mark[n1][n2] = 1; if(n1 <= l1 && c3[n3] == c1[n1] && !ok) { DFS(n1 + 1 ,n2 ,n3 + 1); } if(n2 <= l2 && c3[n3] == c2[n2] && !ok) { DFS(n1 ,n2 + 1 ,n3 + 1); } } int main () { int t ,cas = 1; scanf("%d" ,&t); while(t--) { scanf("%s %s %s" ,c1 ,c2 ,c3); l1 = strlen(c1) - 1; l2 = strlen(c2) - 1; l3 = strlen(c3) - 1; if(l1 + 1 + l2 + 1 != l3 + 1) { printf("Data set %d: no " ,cas ++); continue; } ok = 0; memset(mark ,0 ,sizeof(mark)); DFS(0 ,0 ,0); if(ok) printf("Data set %d: yes " ,cas ++); else printf("Data set %d: no " ,cas ++); } return 0; }