DP,用二维数组来存储每一个状态的结果。ans[i][j]表示s1的前i个字符和s2的前j个字符是否 ///能组合成merge的前i+j个字符的序列状态,若能则为true,否则为false。 ///状态转移方程为:ans[i][j]={1|ans[i][j-1]&&merge[i+j]==s2[j],ans[i-1][j]&&merge[i+j]==s1[i]} /// 否则为false。而ans[0][j]表示s1为空串的情况,同理可知ans[i][0]的意义. ///通过本题,对DP有了进一步的了解。 #include<stdio.h> #include<string.h> char s1[205],s2[205],merge[405]; bool ans[205][205]; int main() { int cas,k=1; scanf("%d",&cas); while(cas--) { scanf("%s%s%s",s1+1,s2+1,merge+1); int i,j,len1=strlen(s1+1),len2=strlen(s2+1); memset(ans,0,sizeof(ans)); for(i=1;i<=len1;i++) { if(s1[i]==merge[i]) ans[i][0]=true; else break; } for(i=1;i<=len2;i++) { if(s2[i]==merge[i]) ans[0][i]=true; else break; } for(i=1;i<=len1;i++) { for(j=1;j<=len2;j++) { if(ans[i][j-1]&&merge[i+j]==s2[j]) ans[i][j]=1; else if(ans[i-1][j]&&merge[i+j]==s1[i]) ans[i][j]=1; else ans[i][j]=0; } } if(ans[len1][len2]) printf("Data set %d: yes/n",k++); else printf("Data set %d: no/n",k++); } }