转载请注明出处:http://blog.csdn.net/a1dark
分析:这题可以用记忆化搜索来做、由于记忆化搜索和DP是相通的、所以也能用DP来做、相用记忆化搜索做一次、注意标记已经访问过的点、以免重复访问超时、
#include<stdio.h> #include<string.h> #define N 205 char str1[N]; char str2[N]; char str3[N*2]; int len1,len2,len3,ans; int vis[N][N]; void dfs(int a,int b,int c){ if(ans)return; if(c==len3){ ans=1; return; } if(vis[a][b])return; vis[a][b]=1; if(str1[a]==str3[c]) dfs(a+1,b,c+1); if(str2[b]==str3[c]) dfs(a,b+1,c+1); } int main(){ int n,cas=1; scanf("%d",&n); while(n--){ scanf("%s%s%s",str1,str2,str3); len1=strlen(str1); len2=strlen(str2); len3=strlen(str3); printf("Data set %d: ",cas);cas++; if(len1+len2!=len3){ printf("no\n"); continue; } memset(vis,0,sizeof(vis)); ans=0; dfs(0,0,0); if(ans==1) printf("yes\n"); else printf("no\n"); } return 0; }